From d8007e4c729ae49054661ee36bf81a94a82556c7 Mon Sep 17 00:00:00 2001 From: amirylm Date: Tue, 20 Feb 2024 19:55:36 +0200 Subject: [PATCH 01/13] update test contract with a flag for checkErr result --- .../automation/testhelpers/LogTriggeredStreamsLookup.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol index 5e210c9d0ac..a5a40f030a3 100644 --- a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol +++ b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol @@ -42,10 +42,12 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt string public feedParamKey = "feedIdHex"; string public timeParamKey = "blockNumber"; uint256 public counter; + bool public checkErrReturnBool; - constructor(bool _useArbitrumBlockNum, bool _verify) { + constructor(bool _useArbitrumBlockNum, bool _verify, bool _checkErrReturnBool) { useArbitrumBlockNum = _useArbitrumBlockNum; verify = _verify; + checkErrReturnBool = _checkErrReturnBool; counter = 0; } @@ -135,7 +137,7 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt bytes memory extraData ) external view override returns (bool upkeepNeeded, bytes memory performData) { // dummy function with default values - return (false, new bytes(0)); + return (checkErrReturnBool, new bytes(0)); } function getBlockNumber() internal view returns (uint256) { From 46b9ec5cc872788b1c2f2974011bec6d48de70c7 Mon Sep 17 00:00:00 2001 From: lei shi Date: Tue, 20 Feb 2024 10:22:46 -0800 Subject: [PATCH 02/13] generate wrappers for LogTriggeredStreamsLookup --- .../log_triggered_streams_lookup_wrapper.go | 32 ++++++++++++++++--- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go b/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go index c92d4b5f5c9..0e9b49af940 100644 --- a/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go +++ b/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go @@ -42,15 +42,15 @@ type Log struct { } var LogTriggeredStreamsLookupMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_useArbitrumBlockNum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_verify\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParamKey\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"feeds\",\"type\":\"string[]\"},{\"internalType\":\"string\",\"name\":\"timeParamKey\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"StreamsLookup\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"LimitOrderExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blob\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"verified\",\"type\":\"bytes\"}],\"name\":\"PerformingLogTriggerUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errCode\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkErrorHandler\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"log\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkLog\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"feedsHex\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParam\",\"type\":\"string\"}],\"name\":\"setFeedParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"newFeeds\",\"type\":\"string[]\"}],\"name\":\"setFeedsHex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"timeParam\",\"type\":\"string\"}],\"name\":\"setTimeParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useArbitrumBlockNum\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x610120604052604260a08181526080918291906200180760c03990526200002a9060019081620000e8565b506040805180820190915260098152680cccacac892c890caf60bb1b60208201526002906200005a908262000264565b5060408051808201909152600b81526a313637b1b5a73ab6b132b960a91b60208201526003906200008c908262000264565b503480156200009a57600080fd5b506040516200184938038062001849833981016040819052620000bd9162000346565b6000805461ffff191692151561ff00191692909217610100911515919091021781556004556200037e565b82805482825590600052602060002090810192821562000133579160200282015b8281111562000133578251829062000122908262000264565b509160200191906001019062000109565b506200014192915062000145565b5090565b80821115620001415760006200015c828262000166565b5060010162000145565b5080546200017490620001d5565b6000825580601f1062000185575050565b601f016020900490600052602060002090810190620001a59190620001a8565b50565b5b80821115620001415760008155600101620001a9565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ea57607f821691505b6020821081036200020b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025f57600081815260208120601f850160051c810160208610156200023a5750805b601f850160051c820191505b818110156200025b5782815560010162000246565b5050505b505050565b81516001600160401b03811115620002805762000280620001bf565b6200029881620002918454620001d5565b8462000211565b602080601f831160018114620002d05760008415620002b75750858301515b600019600386901b1c1916600185901b1785556200025b565b600085815260208120601f198616915b828110156200030157888601518255948401946001909101908401620002e0565b5085821015620003205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b805180151581146200034157600080fd5b919050565b600080604083850312156200035a57600080fd5b620003658362000330565b9150620003756020840162000330565b90509250929050565b611479806200038e6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063642f6cef1161008c578063afb28d1f11610066578063afb28d1f146101e1578063be9a6555146101e9578063c98f10b0146101f1578063fc735e99146101f957600080fd5b8063642f6cef146101915780639525d574146101ae5780639d6f1cc7146101c157600080fd5b80634585e33b116100c85780634585e33b146101415780634b56a42e14610154578063601d5a711461016757806361bc221a1461017a57600080fd5b806305e25131146100ef5780630fb172fb1461010457806340691db41461012e575b600080fd5b6101026100fd366004610afc565b61020b565b005b610117610112366004610bad565b610222565b604051610125929190610c62565b60405180910390f35b61011761013c366004610c85565b61023a565b61010261014f366004610ce8565b610510565b610117610162366004610d5a565b61070e565b610102610175366004610e17565b610762565b61018360045481565b604051908152602001610125565b60005461019e9060ff1681565b6040519015158152602001610125565b6101026101bc366004610e17565b61076e565b6101d46101cf366004610e4c565b61077a565b6040516101259190610e65565b6101d4610826565b610102610833565b6101d4610866565b60005461019e90610100900460ff1681565b805161021e9060019060208401906108f9565b5050565b604080516000808252602082019092525b9250929050565b600060606000610248610873565b90507fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd61027860c0870187610e7f565b600081811061028957610289610ee7565b90506020020135036104885760006102a460c0870187610e7f565b60018181106102b5576102b5610ee7565b905060200201356040516020016102ce91815260200190565b60405160208183030381529060405290506000818060200190518101906102f59190610f16565b9050600061030660c0890189610e7f565b600281811061031757610317610ee7565b9050602002013560405160200161033091815260200190565b60405160208183030381529060405290506000818060200190518101906103579190610f16565b9050600061036860c08b018b610e7f565b600381811061037957610379610ee7565b9050602002013560405160200161039291815260200190565b60405160208183030381529060405290506000818060200190518101906103b99190610f58565b604080516020810188905290810185905273ffffffffffffffffffffffffffffffffffffffff821660608201527fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd60808201529091506002906001906003908a9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527ff055e4a200000000000000000000000000000000000000000000000000000000825261047f9594939291600401611061565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f636f756c64206e6f742066696e64206d61746368696e67206576656e7420736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161047f565b60008061051f83850185610d5a565b915091506000806000808480602001905181019061053d9190611124565b6040805160208101909152600080825254949850929650909450925090610100900460ff1615610636577309dff56a4ff44e0f4436260a04f5cfa65636a48173ffffffffffffffffffffffffffffffffffffffff16638e760afe886000815181106105aa576105aa610ee7565b60200260200101516040518263ffffffff1660e01b81526004016105ce9190610e65565b6000604051808303816000875af11580156105ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106339190810190611161565b90505b6004546106449060016111d8565b6004557f2e00161baa7e3ee28260d12a08ade832b4160748111950f092fc0b921ac6a93382016106a0576040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a45b327f299a03817e683a32b21e29e3ae3c31f1c9c773f7d532836d116b62a9281fbc9d8686866106cd610873565b8c6000815181106106e0576106e0610ee7565b6020026020010151876040516106fb96959493929190611218565b60405180910390a2505050505050505050565b6000606060008484604051602001610727929190611278565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190526001969095509350505050565b600361021e8282611352565b600261021e8282611352565b6001818154811061078a57600080fd5b9060005260206000200160009150905080546107a590610f73565b80601f01602080910402602001604051908101604052809291908181526020018280546107d190610f73565b801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b505050505081565b600280546107a590610f73565b6040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a4565b600380546107a590610f73565b6000805460ff16156108f457606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190610f16565b905090565b504390565b82805482825590600052602060002090810192821561093f579160200282015b8281111561093f578251829061092f9082611352565b5091602001919060010190610919565b5061094b92915061094f565b5090565b8082111561094b576000610963828261096c565b5060010161094f565b50805461097890610f73565b6000825580601f10610988575050565b601f0160209004906000526020600020908101906109a691906109a9565b50565b5b8082111561094b57600081556001016109aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610a3457610a346109be565b604052919050565b600067ffffffffffffffff821115610a5657610a566109be565b5060051b60200190565b600067ffffffffffffffff821115610a7a57610a7a6109be565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112610ab757600080fd5b8135610aca610ac582610a60565b6109ed565b818152846020838601011115610adf57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215610b0f57600080fd5b823567ffffffffffffffff80821115610b2757600080fd5b818501915085601f830112610b3b57600080fd5b8135610b49610ac582610a3c565b81815260059190911b83018401908481019088831115610b6857600080fd5b8585015b83811015610ba057803585811115610b845760008081fd5b610b928b89838a0101610aa6565b845250918601918601610b6c565b5098975050505050505050565b60008060408385031215610bc057600080fd5b82359150602083013567ffffffffffffffff811115610bde57600080fd5b610bea85828601610aa6565b9150509250929050565b60005b83811015610c0f578181015183820152602001610bf7565b50506000910152565b60008151808452610c30816020860160208601610bf4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610c7d6040830184610c18565b949350505050565b60008060408385031215610c9857600080fd5b823567ffffffffffffffff80821115610cb057600080fd5b908401906101008287031215610cc557600080fd5b90925060208401359080821115610cdb57600080fd5b50610bea85828601610aa6565b60008060208385031215610cfb57600080fd5b823567ffffffffffffffff80821115610d1357600080fd5b818501915085601f830112610d2757600080fd5b813581811115610d3657600080fd5b866020828501011115610d4857600080fd5b60209290920196919550909350505050565b60008060408385031215610d6d57600080fd5b823567ffffffffffffffff80821115610d8557600080fd5b818501915085601f830112610d9957600080fd5b81356020610da9610ac583610a3c565b82815260059290921b84018101918181019089841115610dc857600080fd5b8286015b84811015610e0057803586811115610de45760008081fd5b610df28c86838b0101610aa6565b845250918301918301610dcc565b5096505086013592505080821115610cdb57600080fd5b600060208284031215610e2957600080fd5b813567ffffffffffffffff811115610e4057600080fd5b610c7d84828501610aa6565b600060208284031215610e5e57600080fd5b5035919050565b602081526000610e786020830184610c18565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610eb457600080fd5b83018035915067ffffffffffffffff821115610ecf57600080fd5b6020019150600581901b360382131561023357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215610f2857600080fd5b5051919050565b805173ffffffffffffffffffffffffffffffffffffffff81168114610f5357600080fd5b919050565b600060208284031215610f6a57600080fd5b610e7882610f2f565b600181811c90821680610f8757607f821691505b602082108103610fc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008154610fd381610f73565b808552602060018381168015610ff0576001811461102857611056565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550611056565b866000528260002060005b8581101561104e5781548a8201860152908301908401611033565b890184019650505b505050505092915050565b60a08152600061107460a0830188610fc6565b6020838203818501528188548084528284019150828160051b8501018a6000528360002060005b838110156110e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08784030185526110d48383610fc6565b9486019492506001918201910161109b565b505086810360408801526110fa818b610fc6565b94505050505084606084015282810360808401526111188185610c18565b98975050505050505050565b6000806000806080858703121561113a57600080fd5b845193506020850151925061115160408601610f2f565b6060959095015193969295505050565b60006020828403121561117357600080fd5b815167ffffffffffffffff81111561118a57600080fd5b8201601f8101841361119b57600080fd5b80516111a9610ac582610a60565b8181528560208385010111156111be57600080fd5b6111cf826020830160208601610bf4565b95945050505050565b80820180821115611212577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b86815285602082015273ffffffffffffffffffffffffffffffffffffffff8516604082015283606082015260c06080820152600061125960c0830185610c18565b82810360a084015261126b8185610c18565b9998505050505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156112ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08887030185526112db868351610c18565b955093820193908201906001016112a1565b5050858403818701525050506111cf8185610c18565b601f82111561134d57600081815260208120601f850160051c8101602086101561132a5750805b601f850160051c820191505b8181101561134957828155600101611336565b5050505b505050565b815167ffffffffffffffff81111561136c5761136c6109be565b6113808161137a8454610f73565b84611303565b602080601f8311600181146113d3576000841561139d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611349565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561142057888601518255948401946001909101908401611401565b508582101561145c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000810000a307834353534343832643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030", + ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_useArbitrumBlockNum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_verify\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_checkErrReturnBool\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParamKey\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"feeds\",\"type\":\"string[]\"},{\"internalType\":\"string\",\"name\":\"timeParamKey\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"StreamsLookup\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"LimitOrderExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blob\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"verified\",\"type\":\"bytes\"}],\"name\":\"PerformingLogTriggerUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkErrReturnBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errCode\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkErrorHandler\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"log\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkLog\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"feedsHex\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParam\",\"type\":\"string\"}],\"name\":\"setFeedParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"newFeeds\",\"type\":\"string[]\"}],\"name\":\"setFeedsHex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"timeParam\",\"type\":\"string\"}],\"name\":\"setTimeParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useArbitrumBlockNum\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x610120604052604260a08181526080918291906200184d60c03990526200002a9060019081620000fc565b506040805180820190915260098152680cccacac892c890caf60bb1b60208201526002906200005a908262000278565b5060408051808201909152600b81526a313637b1b5a73ab6b132b960a91b60208201526003906200008c908262000278565b503480156200009a57600080fd5b506040516200188f3803806200188f833981016040819052620000bd916200035a565b6000805461ffff191693151561ff00191693909317610100921515929092029190911782556005805460ff1916911515919091179055600455620003a4565b82805482825590600052602060002090810192821562000147579160200282015b8281111562000147578251829062000136908262000278565b50916020019190600101906200011d565b506200015592915062000159565b5090565b80821115620001555760006200017082826200017a565b5060010162000159565b5080546200018890620001e9565b6000825580601f1062000199575050565b601f016020900490600052602060002090810190620001b99190620001bc565b50565b5b80821115620001555760008155600101620001bd565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001fe57607f821691505b6020821081036200021f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027357600081815260208120601f850160051c810160208610156200024e5750805b601f850160051c820191505b818110156200026f578281556001016200025a565b5050505b505050565b81516001600160401b03811115620002945762000294620001d3565b620002ac81620002a58454620001e9565b8462000225565b602080601f831160018114620002e45760008415620002cb5750858301515b600019600386901b1c1916600185901b1785556200026f565b600085815260208120601f198616915b828110156200031557888601518255948401946001909101908401620002f4565b5085821015620003345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b805180151581146200035557600080fd5b919050565b6000806000606084860312156200037057600080fd5b6200037b8462000344565b92506200038b6020850162000344565b91506200039b6040850162000344565b90509250925092565b61149980620003b46000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806361bc221a11610097578063afb28d1f11610066578063afb28d1f146101f9578063be9a655514610201578063c98f10b014610209578063fc735e991461021157600080fd5b806361bc221a146101a2578063642f6cef146101b95780639525d574146101c65780639d6f1cc7146101d957600080fd5b806340691db4116100d357806340691db4146101565780634585e33b146101695780634b56a42e1461017c578063601d5a711461018f57600080fd5b806305e25131146100fa5780630fb172fb1461010f5780631d1477b714610139575b600080fd5b61010d610108366004610b1c565b610223565b005b61012261011d366004610bcd565b61023a565b604051610130929190610c82565b60405180910390f35b6005546101469060ff1681565b6040519015158152602001610130565b610122610164366004610ca5565b61025a565b61010d610177366004610d08565b610530565b61012261018a366004610d7a565b61072e565b61010d61019d366004610e37565b610782565b6101ab60045481565b604051908152602001610130565b6000546101469060ff1681565b61010d6101d4366004610e37565b61078e565b6101ec6101e7366004610e6c565b61079a565b6040516101309190610e85565b6101ec610846565b61010d610853565b6101ec610886565b60005461014690610100900460ff1681565b8051610236906001906020840190610919565b5050565b60055460408051600081526020810190915260ff909116905b9250929050565b600060606000610268610893565b90507fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd61029860c0870187610e9f565b60008181106102a9576102a9610f07565b90506020020135036104a85760006102c460c0870187610e9f565b60018181106102d5576102d5610f07565b905060200201356040516020016102ee91815260200190565b60405160208183030381529060405290506000818060200190518101906103159190610f36565b9050600061032660c0890189610e9f565b600281811061033757610337610f07565b9050602002013560405160200161035091815260200190565b60405160208183030381529060405290506000818060200190518101906103779190610f36565b9050600061038860c08b018b610e9f565b600381811061039957610399610f07565b905060200201356040516020016103b291815260200190565b60405160208183030381529060405290506000818060200190518101906103d99190610f78565b604080516020810188905290810185905273ffffffffffffffffffffffffffffffffffffffff821660608201527fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd60808201529091506002906001906003908a9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527ff055e4a200000000000000000000000000000000000000000000000000000000825261049f9594939291600401611081565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f636f756c64206e6f742066696e64206d61746368696e67206576656e7420736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161049f565b60008061053f83850185610d7a565b915091506000806000808480602001905181019061055d9190611144565b6040805160208101909152600080825254949850929650909450925090610100900460ff1615610656577309dff56a4ff44e0f4436260a04f5cfa65636a48173ffffffffffffffffffffffffffffffffffffffff16638e760afe886000815181106105ca576105ca610f07565b60200260200101516040518263ffffffff1660e01b81526004016105ee9190610e85565b6000604051808303816000875af115801561060d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106539190810190611181565b90505b6004546106649060016111f8565b6004557f2e00161baa7e3ee28260d12a08ade832b4160748111950f092fc0b921ac6a93382016106c0576040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a45b327f299a03817e683a32b21e29e3ae3c31f1c9c773f7d532836d116b62a9281fbc9d8686866106ed610893565b8c60008151811061070057610700610f07565b60200260200101518760405161071b96959493929190611238565b60405180910390a2505050505050505050565b6000606060008484604051602001610747929190611298565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190526001969095509350505050565b60036102368282611372565b60026102368282611372565b600181815481106107aa57600080fd5b9060005260206000200160009150905080546107c590610f93565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190610f93565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b505050505081565b600280546107c590610f93565b6040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a4565b600380546107c590610f93565b6000805460ff161561091457606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190610f36565b905090565b504390565b82805482825590600052602060002090810192821561095f579160200282015b8281111561095f578251829061094f9082611372565b5091602001919060010190610939565b5061096b92915061096f565b5090565b8082111561096b576000610983828261098c565b5060010161096f565b50805461099890610f93565b6000825580601f106109a8575050565b601f0160209004906000526020600020908101906109c691906109c9565b50565b5b8082111561096b57600081556001016109ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610a5457610a546109de565b604052919050565b600067ffffffffffffffff821115610a7657610a766109de565b5060051b60200190565b600067ffffffffffffffff821115610a9a57610a9a6109de565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112610ad757600080fd5b8135610aea610ae582610a80565b610a0d565b818152846020838601011115610aff57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215610b2f57600080fd5b823567ffffffffffffffff80821115610b4757600080fd5b818501915085601f830112610b5b57600080fd5b8135610b69610ae582610a5c565b81815260059190911b83018401908481019088831115610b8857600080fd5b8585015b83811015610bc057803585811115610ba45760008081fd5b610bb28b89838a0101610ac6565b845250918601918601610b8c565b5098975050505050505050565b60008060408385031215610be057600080fd5b82359150602083013567ffffffffffffffff811115610bfe57600080fd5b610c0a85828601610ac6565b9150509250929050565b60005b83811015610c2f578181015183820152602001610c17565b50506000910152565b60008151808452610c50816020860160208601610c14565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610c9d6040830184610c38565b949350505050565b60008060408385031215610cb857600080fd5b823567ffffffffffffffff80821115610cd057600080fd5b908401906101008287031215610ce557600080fd5b90925060208401359080821115610cfb57600080fd5b50610c0a85828601610ac6565b60008060208385031215610d1b57600080fd5b823567ffffffffffffffff80821115610d3357600080fd5b818501915085601f830112610d4757600080fd5b813581811115610d5657600080fd5b866020828501011115610d6857600080fd5b60209290920196919550909350505050565b60008060408385031215610d8d57600080fd5b823567ffffffffffffffff80821115610da557600080fd5b818501915085601f830112610db957600080fd5b81356020610dc9610ae583610a5c565b82815260059290921b84018101918181019089841115610de857600080fd5b8286015b84811015610e2057803586811115610e045760008081fd5b610e128c86838b0101610ac6565b845250918301918301610dec565b5096505086013592505080821115610cfb57600080fd5b600060208284031215610e4957600080fd5b813567ffffffffffffffff811115610e6057600080fd5b610c9d84828501610ac6565b600060208284031215610e7e57600080fd5b5035919050565b602081526000610e986020830184610c38565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610ed457600080fd5b83018035915067ffffffffffffffff821115610eef57600080fd5b6020019150600581901b360382131561025357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215610f4857600080fd5b5051919050565b805173ffffffffffffffffffffffffffffffffffffffff81168114610f7357600080fd5b919050565b600060208284031215610f8a57600080fd5b610e9882610f4f565b600181811c90821680610fa757607f821691505b602082108103610fe0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008154610ff381610f93565b808552602060018381168015611010576001811461104857611076565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550611076565b866000528260002060005b8581101561106e5781548a8201860152908301908401611053565b890184019650505b505050505092915050565b60a08152600061109460a0830188610fe6565b6020838203818501528188548084528284019150828160051b8501018a6000528360002060005b83811015611106577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08784030185526110f48383610fe6565b948601949250600191820191016110bb565b5050868103604088015261111a818b610fe6565b94505050505084606084015282810360808401526111388185610c38565b98975050505050505050565b6000806000806080858703121561115a57600080fd5b845193506020850151925061117160408601610f4f565b6060959095015193969295505050565b60006020828403121561119357600080fd5b815167ffffffffffffffff8111156111aa57600080fd5b8201601f810184136111bb57600080fd5b80516111c9610ae582610a80565b8181528560208385010111156111de57600080fd5b6111ef826020830160208601610c14565b95945050505050565b80820180821115611232577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b86815285602082015273ffffffffffffffffffffffffffffffffffffffff8516604082015283606082015260c06080820152600061127960c0830185610c38565b82810360a084015261128b8185610c38565b9998505050505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561130d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08887030185526112fb868351610c38565b955093820193908201906001016112c1565b5050858403818701525050506111ef8185610c38565b601f82111561136d57600081815260208120601f850160051c8101602086101561134a5750805b601f850160051c820191505b8181101561136957828155600101611356565b5050505b505050565b815167ffffffffffffffff81111561138c5761138c6109de565b6113a08161139a8454610f93565b84611323565b602080601f8311600181146113f357600084156113bd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611369565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561144057888601518255948401946001909101908401611421565b508582101561147c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000810000a307834353534343832643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030", } var LogTriggeredStreamsLookupABI = LogTriggeredStreamsLookupMetaData.ABI var LogTriggeredStreamsLookupBin = LogTriggeredStreamsLookupMetaData.Bin -func DeployLogTriggeredStreamsLookup(auth *bind.TransactOpts, backend bind.ContractBackend, _useArbitrumBlockNum bool, _verify bool) (common.Address, *types.Transaction, *LogTriggeredStreamsLookup, error) { +func DeployLogTriggeredStreamsLookup(auth *bind.TransactOpts, backend bind.ContractBackend, _useArbitrumBlockNum bool, _verify bool, _checkErrReturnBool bool) (common.Address, *types.Transaction, *LogTriggeredStreamsLookup, error) { parsed, err := LogTriggeredStreamsLookupMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -59,7 +59,7 @@ func DeployLogTriggeredStreamsLookup(auth *bind.TransactOpts, backend bind.Contr return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LogTriggeredStreamsLookupBin), backend, _useArbitrumBlockNum, _verify) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LogTriggeredStreamsLookupBin), backend, _useArbitrumBlockNum, _verify, _checkErrReturnBool) if err != nil { return common.Address{}, nil, nil, err } @@ -205,6 +205,28 @@ func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupCallerSession) CheckC return _LogTriggeredStreamsLookup.Contract.CheckCallback(&_LogTriggeredStreamsLookup.CallOpts, values, extraData) } +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupCaller) CheckErrReturnBool(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _LogTriggeredStreamsLookup.contract.Call(opts, &out, "checkErrReturnBool") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupSession) CheckErrReturnBool() (bool, error) { + return _LogTriggeredStreamsLookup.Contract.CheckErrReturnBool(&_LogTriggeredStreamsLookup.CallOpts) +} + +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupCallerSession) CheckErrReturnBool() (bool, error) { + return _LogTriggeredStreamsLookup.Contract.CheckErrReturnBool(&_LogTriggeredStreamsLookup.CallOpts) +} + func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupCaller) CheckErrorHandler(opts *bind.CallOpts, errCode *big.Int, extraData []byte) (CheckErrorHandler, error) { @@ -749,6 +771,8 @@ func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookup) Address() common.Ad type LogTriggeredStreamsLookupInterface interface { CheckCallback(opts *bind.CallOpts, values [][]byte, extraData []byte) (bool, []byte, error) + CheckErrReturnBool(opts *bind.CallOpts) (bool, error) + CheckErrorHandler(opts *bind.CallOpts, errCode *big.Int, extraData []byte) (CheckErrorHandler, error) diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 0eb4bda80ae..5d847261a6f 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -46,7 +46,7 @@ keeper_registry_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistry2_1/Keep keeper_registry_wrapper_2_2: ../../contracts/solc/v0.8.16/AutomationRegistry2_2/AutomationRegistry2_2.abi ../../contracts/solc/v0.8.16/AutomationRegistry2_2/AutomationRegistry2_2.bin 8f1c6d3eddf36201a556a101350abd6eb733d4c3177da2ddb5eca0d24d9a88ef keepers_vrf_consumer: ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.abi ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.bin fa75572e689c9e84705c63e8dbe1b7b8aa1a8fe82d66356c4873d024bb9166e8 log_emitter: ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.abi ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.bin 4b129ab93432c95ff9143f0631323e189887668889e0b36ccccf18a571e41ccf -log_triggered_streams_lookup_wrapper: ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.abi ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.bin bb5f9f72c698fb2a79667cbf9206fa3c848aa4cb4866c5fa8a541627f0af48ec +log_triggered_streams_lookup_wrapper: ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.abi ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.bin fc137b8758ab155e539a65737a0c7510b01558aa9a7da205addcecf26c5f45ad log_upkeep_counter_wrapper: ../../contracts/solc/v0.8.6/LogUpkeepCounter/LogUpkeepCounter.abi ../../contracts/solc/v0.8.6/LogUpkeepCounter/LogUpkeepCounter.bin 42426bbb83f96dfbe55fc576d6c65020eaeed690e2289cf99b0c4aa810a5f4ec mock_aggregator_proxy: ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.abi ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.bin b16c108f3dd384c342ddff5e94da7c0a8d39d1be5e3d8f2cf61ecc7f0e50ff42 mock_ethlink_aggregator_wrapper: ../../contracts/solc/v0.6/MockETHLINKAggregator/MockETHLINKAggregator.abi ../../contracts/solc/v0.6/MockETHLINKAggregator/MockETHLINKAggregator.bin 1c52c24f797b8482aa12b8251dcea1c072827bd5b3426b822621261944b99ca0 From 777e5aa5d7698603f5b1dc8765dca0929ca6764a Mon Sep 17 00:00:00 2001 From: amirylm Date: Wed, 21 Feb 2024 15:13:03 +0200 Subject: [PATCH 03/13] handling empty performData case for err handler --- .../v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol index a5a40f030a3..eabbc871399 100644 --- a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol +++ b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol @@ -26,6 +26,7 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt bytes verified ); event LimitOrderExecuted(uint256 indexed orderId, uint256 indexed amount, address indexed exchange); // keccak(LimitOrderExecuted(uint256,uint256,address)) => 0xd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd + event IgnoringErrorHandlerData(); ArbSys internal constant ARB_SYS = ArbSys(0x0000000000000000000000000000000000000064); IVerifierProxy internal constant VERIFIER = IVerifierProxy(0x09DFf56A4fF44e0f4436260A04F5CFa65636A481); @@ -96,6 +97,9 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt } function performUpkeep(bytes calldata performData) external override { + if (performData.length == 0) { + emit IgnoringErrorHandlerData(); + } (bytes[] memory values, bytes memory extraData) = abi.decode(performData, (bytes[], bytes)); (uint256 orderId, uint256 amount, address exchange, bytes32 logTopic0) = abi.decode( extraData, From 22b2dcf4f498bb2f1ed44626c97f596a2a8051a6 Mon Sep 17 00:00:00 2001 From: amirylm Date: Wed, 21 Feb 2024 17:39:07 +0200 Subject: [PATCH 04/13] test (wip) --- .../plugins/ocr2keeper/integration_21_test.go | 128 +++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 81a35a5ced2..426505d8e46 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -352,7 +352,9 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event - _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount) + _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool { + return false + }) _ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken) _ = feeds.EnableMercury(t, backend, registry, registryOwner) _ = feeds.VerifyEnv(t, backend, registry, registryOwner) @@ -374,6 +376,124 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { done() } +func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { + g := gomega.NewWithT(t) + + // setup blockchain + linkOwner := testutils.MustNewSimTransactor(t) // owns all the link + registryOwner := testutils.MustNewSimTransactor(t) // registry owner + upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner + genesisData := core.GenesisAlloc{ + linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, + registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, + upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, + } + + // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether + var nodeKeys [5]ethkey.KeyV2 + for i := int64(0); i < 5; i++ { + nodeKeys[i] = cltest.MustGenerateRandomKey(t) + genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} + } + + backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) + stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain + defer stopMining() + + // Deploy registry + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) + require.NoError(t, err) + + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) + require.NoError(t, err) + + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) + require.NoError(t, err) + + registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) + + _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner) + + const upkeepCount = 10 + const mercuryFailRounds = 7 + const mercuryFailCount = upkeepCount * 3 * mercuryFailRounds + + // testing with the mercury server involves mocking responses. currently, + // there is not a way to connect a mercury call to an upkeep id (though we + // could add custom headers) so the test must be fairly basic and just + // count calls before switching to successes + var ( + mu sync.Mutex + count int + ) + + mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + defer mu.Unlock() + + count++ + + _ = r.ParseForm() + + t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) + + for key, value := range r.Form { + t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) + } + + // the streams lookup retries against the remote server 3 times before + // returning a result as retryable. + // the simulation here should force the streams lookup process to return + // retryable 2 times. + // the total count of failures should be (upkeepCount * 3 * tryCount) + if count <= mercuryFailCount { + w.WriteHeader(http.StatusNotFound) + return + } + + // start sending success messages + output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` + + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(output)) + }) + + defer mercuryServer.Stop() + + _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) + require.NoError(t, err) + + backend.Commit() + + feeds, err := newFeedLookupUpkeepController(backend, registryOwner) + require.NoError(t, err, "no error expected from creating a feed lookup controller") + + // deploy multiple upkeeps that listen to a log emitter and need to be + // performed for each log event + require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(i int) bool { + return i%2 == 1 + })) + require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)) + require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner)) + require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner)) + + // start emitting events in a separate go-routine + // feed lookup relies on a single contract event log to perform multiple + // listener contracts + go func() { + // only 1 event is necessary to make all 10 upkeeps eligible + _ = feeds.EmitEvents(t, backend, 1, func() { + // pause per emit for expected block production time + time.Sleep(3 * time.Second) + }) + }() + + listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1)) + g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) + + done() +} + func emitEvents(ctx context.Context, t *testing.T, n int, contracts []*log_upkeep_counter_wrapper.LogUpkeepCounter, carrol *bind.TransactOpts, afterEmit func()) { for i := 0; i < n && ctx.Err() == nil; i++ { for _, contract := range contracts { @@ -789,17 +909,23 @@ func (c *feedLookupUpkeepController) DeployUpkeeps( backend *backends.SimulatedBackend, owner *bind.TransactOpts, count int, + checkErrResultsProvider func(i int) bool, ) error { addresses := make([]common.Address, count) contracts := make([]*log_triggered_streams_lookup_wrapper.LogTriggeredStreamsLookup, count) // deploy n upkeep contracts for x := 0; x < count; x++ { + var checkErrResult bool + if checkErrResultsProvider != nil { + checkErrResult = checkErrResultsProvider(x) + } addr, _, contract, err := log_triggered_streams_lookup_wrapper.DeployLogTriggeredStreamsLookup( owner, backend, false, false, + checkErrResult, ) if err != nil { From c8aa14274b1309bcbdb7124d2f765194a631cf5b Mon Sep 17 00:00:00 2001 From: amirylm Date: Wed, 21 Feb 2024 18:17:41 +0200 Subject: [PATCH 05/13] fixing contract --- .../v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol index eabbc871399..5d11065fcec 100644 --- a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol +++ b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol @@ -99,6 +99,7 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt function performUpkeep(bytes calldata performData) external override { if (performData.length == 0) { emit IgnoringErrorHandlerData(); + return } (bytes[] memory values, bytes memory extraData) = abi.decode(performData, (bytes[], bytes)); (uint256 orderId, uint256 amount, address exchange, bytes32 logTopic0) = abi.decode( From 6b04b6c011a9ac266f273b13b7fc00dd5efd1b16 Mon Sep 17 00:00:00 2001 From: amirylm Date: Wed, 21 Feb 2024 21:04:44 +0200 Subject: [PATCH 06/13] waiting for err handler logs (wip) --- .../plugins/ocr2keeper/integration_21_test.go | 67 +++++++++++++++++-- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 426505d8e46..597535944b7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -13,6 +13,7 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" @@ -457,7 +458,6 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(output)) }) - defer mercuryServer.Stop() _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1)))) @@ -470,9 +470,10 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { // deploy multiple upkeeps that listen to a log emitter and need to be // performed for each log event - require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(i int) bool { + checkResultsProvider := func(i int) bool { return i%2 == 1 - })) + } + require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, checkResultsProvider)) require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)) require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner)) require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner)) @@ -488,12 +489,68 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { }) }() - listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1)) - g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) + topic := log_triggered_streams_lookup_wrapper.LogTriggeredStreamsLookupIgnoringErrorHandlerData{}.Topic() + addrsToCheck := make([]common.Address, 0) + idsToCheck := make([]*big.Int, 0) + for i, uid := range feeds.UpkeepsIds() { + if checkResultsProvider(i) { + addrsToCheck = append(addrsToCheck, feeds.addresses[i]) + idsToCheck = append(idsToCheck, uid) + } + } + errHandlerListener, errHandlerDone := listenEvents(t, backend, addrsToCheck, topic, int64(1), 1) + g.Eventually(errHandlerListener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) + errHandlerDone() + listener, done := listenPerformed(t, backend, registry, idsToCheck, int64(1)) + g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) done() } +func listenEvents(t *testing.T, backend *backends.SimulatedBackend, addrs []common.Address, topic common.Hash, startBlock int64, count int) (func() bool, func()) { + ctx, cancel := context.WithCancel(testutils.Context(t)) + visited := make(map[string]bool) + cache := &sync.Map{} + start := startBlock + + go func() { + for ctx.Err() == nil { + currentBlock := backend.Blockchain().CurrentBlock().Number + logs, err := backend.FilterLogs(ctx, ethereum.FilterQuery{ + Addresses: addrs, + Topics: [][]common.Hash{{topic}}, + FromBlock: currentBlock, + ToBlock: big.NewInt(start), + }) + if err != nil { + if ctx.Err() != nil { + return + } + t.Logf("Error fetching logs: %v", err) + continue + } + for _, log := range logs { + visitedID := fmt.Sprintf("%s:%s:%d", log.BlockHash.Hex(), log.TxHash.Hex(), log.Index) + if visited[visitedID] { + continue + } + visited[visitedID] = true + cacheID := log.Address.Hex() + count, ok := cache.Load(cacheID) + if !ok { + cache.Store(cacheID, 1) + continue + } + countI := count.(int) + cache.Store(cacheID, countI+1) + } + time.Sleep(time.Second) + } + }() + + return mapListener(cache, count), cancel +} + func emitEvents(ctx context.Context, t *testing.T, n int, contracts []*log_upkeep_counter_wrapper.LogUpkeepCounter, carrol *bind.TransactOpts, afterEmit func()) { for i := 0; i < n && ctx.Err() == nil; i++ { for _, contract := range contracts { From f8f7db9092fa69cc5e05583895ecdccfa9a4cbb4 Mon Sep 17 00:00:00 2001 From: lei shi Date: Wed, 21 Feb 2024 11:28:02 -0800 Subject: [PATCH 07/13] update contract and generate wrappers --- .../testhelpers/LogTriggeredStreamsLookup.sol | 2 +- .../log_triggered_streams_lookup_wrapper.go | 132 +++++++++++++++++- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 3 files changed, 132 insertions(+), 4 deletions(-) diff --git a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol index 5d11065fcec..d0b89b37b31 100644 --- a/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol +++ b/contracts/src/v0.8/automation/testhelpers/LogTriggeredStreamsLookup.sol @@ -99,7 +99,7 @@ contract LogTriggeredStreamsLookup is ILogAutomation, StreamsLookupCompatibleInt function performUpkeep(bytes calldata performData) external override { if (performData.length == 0) { emit IgnoringErrorHandlerData(); - return + return; } (bytes[] memory values, bytes memory extraData) = abi.decode(performData, (bytes[], bytes)); (uint256 orderId, uint256 amount, address exchange, bytes32 logTopic0) = abi.decode( diff --git a/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go b/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go index 0e9b49af940..766f564ba71 100644 --- a/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go +++ b/core/gethwrappers/generated/log_triggered_streams_lookup_wrapper/log_triggered_streams_lookup_wrapper.go @@ -42,8 +42,8 @@ type Log struct { } var LogTriggeredStreamsLookupMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_useArbitrumBlockNum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_verify\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_checkErrReturnBool\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParamKey\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"feeds\",\"type\":\"string[]\"},{\"internalType\":\"string\",\"name\":\"timeParamKey\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"StreamsLookup\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"LimitOrderExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blob\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"verified\",\"type\":\"bytes\"}],\"name\":\"PerformingLogTriggerUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkErrReturnBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errCode\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkErrorHandler\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"log\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkLog\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"feedsHex\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParam\",\"type\":\"string\"}],\"name\":\"setFeedParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"newFeeds\",\"type\":\"string[]\"}],\"name\":\"setFeedsHex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"timeParam\",\"type\":\"string\"}],\"name\":\"setTimeParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useArbitrumBlockNum\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x610120604052604260a08181526080918291906200184d60c03990526200002a9060019081620000fc565b506040805180820190915260098152680cccacac892c890caf60bb1b60208201526002906200005a908262000278565b5060408051808201909152600b81526a313637b1b5a73ab6b132b960a91b60208201526003906200008c908262000278565b503480156200009a57600080fd5b506040516200188f3803806200188f833981016040819052620000bd916200035a565b6000805461ffff191693151561ff00191693909317610100921515929092029190911782556005805460ff1916911515919091179055600455620003a4565b82805482825590600052602060002090810192821562000147579160200282015b8281111562000147578251829062000136908262000278565b50916020019190600101906200011d565b506200015592915062000159565b5090565b80821115620001555760006200017082826200017a565b5060010162000159565b5080546200018890620001e9565b6000825580601f1062000199575050565b601f016020900490600052602060002090810190620001b99190620001bc565b50565b5b80821115620001555760008155600101620001bd565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001fe57607f821691505b6020821081036200021f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027357600081815260208120601f850160051c810160208610156200024e5750805b601f850160051c820191505b818110156200026f578281556001016200025a565b5050505b505050565b81516001600160401b03811115620002945762000294620001d3565b620002ac81620002a58454620001e9565b8462000225565b602080601f831160018114620002e45760008415620002cb5750858301515b600019600386901b1c1916600185901b1785556200026f565b600085815260208120601f198616915b828110156200031557888601518255948401946001909101908401620002f4565b5085821015620003345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b805180151581146200035557600080fd5b919050565b6000806000606084860312156200037057600080fd5b6200037b8462000344565b92506200038b6020850162000344565b91506200039b6040850162000344565b90509250925092565b61149980620003b46000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806361bc221a11610097578063afb28d1f11610066578063afb28d1f146101f9578063be9a655514610201578063c98f10b014610209578063fc735e991461021157600080fd5b806361bc221a146101a2578063642f6cef146101b95780639525d574146101c65780639d6f1cc7146101d957600080fd5b806340691db4116100d357806340691db4146101565780634585e33b146101695780634b56a42e1461017c578063601d5a711461018f57600080fd5b806305e25131146100fa5780630fb172fb1461010f5780631d1477b714610139575b600080fd5b61010d610108366004610b1c565b610223565b005b61012261011d366004610bcd565b61023a565b604051610130929190610c82565b60405180910390f35b6005546101469060ff1681565b6040519015158152602001610130565b610122610164366004610ca5565b61025a565b61010d610177366004610d08565b610530565b61012261018a366004610d7a565b61072e565b61010d61019d366004610e37565b610782565b6101ab60045481565b604051908152602001610130565b6000546101469060ff1681565b61010d6101d4366004610e37565b61078e565b6101ec6101e7366004610e6c565b61079a565b6040516101309190610e85565b6101ec610846565b61010d610853565b6101ec610886565b60005461014690610100900460ff1681565b8051610236906001906020840190610919565b5050565b60055460408051600081526020810190915260ff909116905b9250929050565b600060606000610268610893565b90507fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd61029860c0870187610e9f565b60008181106102a9576102a9610f07565b90506020020135036104a85760006102c460c0870187610e9f565b60018181106102d5576102d5610f07565b905060200201356040516020016102ee91815260200190565b60405160208183030381529060405290506000818060200190518101906103159190610f36565b9050600061032660c0890189610e9f565b600281811061033757610337610f07565b9050602002013560405160200161035091815260200190565b60405160208183030381529060405290506000818060200190518101906103779190610f36565b9050600061038860c08b018b610e9f565b600381811061039957610399610f07565b905060200201356040516020016103b291815260200190565b60405160208183030381529060405290506000818060200190518101906103d99190610f78565b604080516020810188905290810185905273ffffffffffffffffffffffffffffffffffffffff821660608201527fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd60808201529091506002906001906003908a9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527ff055e4a200000000000000000000000000000000000000000000000000000000825261049f9594939291600401611081565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f636f756c64206e6f742066696e64206d61746368696e67206576656e7420736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161049f565b60008061053f83850185610d7a565b915091506000806000808480602001905181019061055d9190611144565b6040805160208101909152600080825254949850929650909450925090610100900460ff1615610656577309dff56a4ff44e0f4436260a04f5cfa65636a48173ffffffffffffffffffffffffffffffffffffffff16638e760afe886000815181106105ca576105ca610f07565b60200260200101516040518263ffffffff1660e01b81526004016105ee9190610e85565b6000604051808303816000875af115801561060d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106539190810190611181565b90505b6004546106649060016111f8565b6004557f2e00161baa7e3ee28260d12a08ade832b4160748111950f092fc0b921ac6a93382016106c0576040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a45b327f299a03817e683a32b21e29e3ae3c31f1c9c773f7d532836d116b62a9281fbc9d8686866106ed610893565b8c60008151811061070057610700610f07565b60200260200101518760405161071b96959493929190611238565b60405180910390a2505050505050505050565b6000606060008484604051602001610747929190611298565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190526001969095509350505050565b60036102368282611372565b60026102368282611372565b600181815481106107aa57600080fd5b9060005260206000200160009150905080546107c590610f93565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190610f93565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b505050505081565b600280546107c590610f93565b6040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a4565b600380546107c590610f93565b6000805460ff161561091457606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190610f36565b905090565b504390565b82805482825590600052602060002090810192821561095f579160200282015b8281111561095f578251829061094f9082611372565b5091602001919060010190610939565b5061096b92915061096f565b5090565b8082111561096b576000610983828261098c565b5060010161096f565b50805461099890610f93565b6000825580601f106109a8575050565b601f0160209004906000526020600020908101906109c691906109c9565b50565b5b8082111561096b57600081556001016109ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610a5457610a546109de565b604052919050565b600067ffffffffffffffff821115610a7657610a766109de565b5060051b60200190565b600067ffffffffffffffff821115610a9a57610a9a6109de565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112610ad757600080fd5b8135610aea610ae582610a80565b610a0d565b818152846020838601011115610aff57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215610b2f57600080fd5b823567ffffffffffffffff80821115610b4757600080fd5b818501915085601f830112610b5b57600080fd5b8135610b69610ae582610a5c565b81815260059190911b83018401908481019088831115610b8857600080fd5b8585015b83811015610bc057803585811115610ba45760008081fd5b610bb28b89838a0101610ac6565b845250918601918601610b8c565b5098975050505050505050565b60008060408385031215610be057600080fd5b82359150602083013567ffffffffffffffff811115610bfe57600080fd5b610c0a85828601610ac6565b9150509250929050565b60005b83811015610c2f578181015183820152602001610c17565b50506000910152565b60008151808452610c50816020860160208601610c14565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610c9d6040830184610c38565b949350505050565b60008060408385031215610cb857600080fd5b823567ffffffffffffffff80821115610cd057600080fd5b908401906101008287031215610ce557600080fd5b90925060208401359080821115610cfb57600080fd5b50610c0a85828601610ac6565b60008060208385031215610d1b57600080fd5b823567ffffffffffffffff80821115610d3357600080fd5b818501915085601f830112610d4757600080fd5b813581811115610d5657600080fd5b866020828501011115610d6857600080fd5b60209290920196919550909350505050565b60008060408385031215610d8d57600080fd5b823567ffffffffffffffff80821115610da557600080fd5b818501915085601f830112610db957600080fd5b81356020610dc9610ae583610a5c565b82815260059290921b84018101918181019089841115610de857600080fd5b8286015b84811015610e2057803586811115610e045760008081fd5b610e128c86838b0101610ac6565b845250918301918301610dec565b5096505086013592505080821115610cfb57600080fd5b600060208284031215610e4957600080fd5b813567ffffffffffffffff811115610e6057600080fd5b610c9d84828501610ac6565b600060208284031215610e7e57600080fd5b5035919050565b602081526000610e986020830184610c38565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610ed457600080fd5b83018035915067ffffffffffffffff821115610eef57600080fd5b6020019150600581901b360382131561025357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215610f4857600080fd5b5051919050565b805173ffffffffffffffffffffffffffffffffffffffff81168114610f7357600080fd5b919050565b600060208284031215610f8a57600080fd5b610e9882610f4f565b600181811c90821680610fa757607f821691505b602082108103610fe0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008154610ff381610f93565b808552602060018381168015611010576001811461104857611076565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550611076565b866000528260002060005b8581101561106e5781548a8201860152908301908401611053565b890184019650505b505050505092915050565b60a08152600061109460a0830188610fe6565b6020838203818501528188548084528284019150828160051b8501018a6000528360002060005b83811015611106577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08784030185526110f48383610fe6565b948601949250600191820191016110bb565b5050868103604088015261111a818b610fe6565b94505050505084606084015282810360808401526111388185610c38565b98975050505050505050565b6000806000806080858703121561115a57600080fd5b845193506020850151925061117160408601610f4f565b6060959095015193969295505050565b60006020828403121561119357600080fd5b815167ffffffffffffffff8111156111aa57600080fd5b8201601f810184136111bb57600080fd5b80516111c9610ae582610a80565b8181528560208385010111156111de57600080fd5b6111ef826020830160208601610c14565b95945050505050565b80820180821115611232577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b86815285602082015273ffffffffffffffffffffffffffffffffffffffff8516604082015283606082015260c06080820152600061127960c0830185610c38565b82810360a084015261128b8185610c38565b9998505050505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561130d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08887030185526112fb868351610c38565b955093820193908201906001016112c1565b5050858403818701525050506111ef8185610c38565b601f82111561136d57600081815260208120601f850160051c8101602086101561134a5750805b601f850160051c820191505b8181101561136957828155600101611356565b5050505b505050565b815167ffffffffffffffff81111561138c5761138c6109de565b6113a08161139a8454610f93565b84611323565b602080601f8311600181146113f357600084156113bd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611369565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561144057888601518255948401946001909101908401611421565b508582101561147c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000810000a307834353534343832643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030", + ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_useArbitrumBlockNum\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_verify\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_checkErrReturnBool\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParamKey\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"feeds\",\"type\":\"string[]\"},{\"internalType\":\"string\",\"name\":\"timeParamKey\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"StreamsLookup\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"IgnoringErrorHandlerData\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"LimitOrderExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"orderId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blob\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"verified\",\"type\":\"bytes\"}],\"name\":\"PerformingLogTriggerUpkeep\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkErrReturnBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errCode\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkErrorHandler\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"log\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkLog\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"feedsHex\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"feedParam\",\"type\":\"string\"}],\"name\":\"setFeedParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"newFeeds\",\"type\":\"string[]\"}],\"name\":\"setFeedsHex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"timeParam\",\"type\":\"string\"}],\"name\":\"setTimeParamKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"start\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeParamKey\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useArbitrumBlockNum\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x610120604052604260a08181526080918291906200188360c03990526200002a9060019081620000fc565b506040805180820190915260098152680cccacac892c890caf60bb1b60208201526002906200005a908262000278565b5060408051808201909152600b81526a313637b1b5a73ab6b132b960a91b60208201526003906200008c908262000278565b503480156200009a57600080fd5b50604051620018c5380380620018c5833981016040819052620000bd916200035a565b6000805461ffff191693151561ff00191693909317610100921515929092029190911782556005805460ff1916911515919091179055600455620003a4565b82805482825590600052602060002090810192821562000147579160200282015b8281111562000147578251829062000136908262000278565b50916020019190600101906200011d565b506200015592915062000159565b5090565b80821115620001555760006200017082826200017a565b5060010162000159565b5080546200018890620001e9565b6000825580601f1062000199575050565b601f016020900490600052602060002090810190620001b99190620001bc565b50565b5b80821115620001555760008155600101620001bd565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001fe57607f821691505b6020821081036200021f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027357600081815260208120601f850160051c810160208610156200024e5750805b601f850160051c820191505b818110156200026f578281556001016200025a565b5050505b505050565b81516001600160401b03811115620002945762000294620001d3565b620002ac81620002a58454620001e9565b8462000225565b602080601f831160018114620002e45760008415620002cb5750858301515b600019600386901b1c1916600185901b1785556200026f565b600085815260208120601f198616915b828110156200031557888601518255948401946001909101908401620002f4565b5085821015620003345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b805180151581146200035557600080fd5b919050565b6000806000606084860312156200037057600080fd5b6200037b8462000344565b92506200038b6020850162000344565b91506200039b6040850162000344565b90509250925092565b6114cf80620003b46000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806361bc221a11610097578063afb28d1f11610066578063afb28d1f146101f9578063be9a655514610201578063c98f10b014610209578063fc735e991461021157600080fd5b806361bc221a146101a2578063642f6cef146101b95780639525d574146101c65780639d6f1cc7146101d957600080fd5b806340691db4116100d357806340691db4146101565780634585e33b146101695780634b56a42e1461017c578063601d5a711461018f57600080fd5b806305e25131146100fa5780630fb172fb1461010f5780631d1477b714610139575b600080fd5b61010d610108366004610b52565b610223565b005b61012261011d366004610c03565b61023a565b604051610130929190610cb8565b60405180910390f35b6005546101469060ff1681565b6040519015158152602001610130565b610122610164366004610cdb565b61025a565b61010d610177366004610d3e565b610530565b61012261018a366004610db0565b610764565b61010d61019d366004610e6d565b6107b8565b6101ab60045481565b604051908152602001610130565b6000546101469060ff1681565b61010d6101d4366004610e6d565b6107c4565b6101ec6101e7366004610ea2565b6107d0565b6040516101309190610ebb565b6101ec61087c565b61010d610889565b6101ec6108bc565b60005461014690610100900460ff1681565b805161023690600190602084019061094f565b5050565b60055460408051600081526020810190915260ff909116905b9250929050565b6000606060006102686108c9565b90507fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd61029860c0870187610ed5565b60008181106102a9576102a9610f3d565b90506020020135036104a85760006102c460c0870187610ed5565b60018181106102d5576102d5610f3d565b905060200201356040516020016102ee91815260200190565b60405160208183030381529060405290506000818060200190518101906103159190610f6c565b9050600061032660c0890189610ed5565b600281811061033757610337610f3d565b9050602002013560405160200161035091815260200190565b60405160208183030381529060405290506000818060200190518101906103779190610f6c565b9050600061038860c08b018b610ed5565b600381811061039957610399610f3d565b905060200201356040516020016103b291815260200190565b60405160208183030381529060405290506000818060200190518101906103d99190610fae565b604080516020810188905290810185905273ffffffffffffffffffffffffffffffffffffffff821660608201527fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd60808201529091506002906001906003908a9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527ff055e4a200000000000000000000000000000000000000000000000000000000825261049f95949392916004016110b7565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f636f756c64206e6f742066696e64206d61746368696e67206576656e7420736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161049f565b6000819003610566576040517f4f11cf8b97a2a25842c70eb74501fde8edea68ca2884190c1e3d26c8850441fe90600090a15050565b60008061057583850185610db0565b9150915060008060008084806020019051810190610593919061117a565b6040805160208101909152600080825254949850929650909450925090610100900460ff161561068c577309dff56a4ff44e0f4436260a04f5cfa65636a48173ffffffffffffffffffffffffffffffffffffffff16638e760afe8860008151811061060057610600610f3d565b60200260200101516040518263ffffffff1660e01b81526004016106249190610ebb565b6000604051808303816000875af1158015610643573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261068991908101906111b7565b90505b60045461069a90600161122e565b6004557f2e00161baa7e3ee28260d12a08ade832b4160748111950f092fc0b921ac6a93382016106f6576040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a45b327f299a03817e683a32b21e29e3ae3c31f1c9c773f7d532836d116b62a9281fbc9d8686866107236108c9565b8c60008151811061073657610736610f3d565b6020026020010151876040516107519695949392919061126e565b60405180910390a2505050505050505050565b600060606000848460405160200161077d9291906112ce565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190526001969095509350505050565b600361023682826113a8565b600261023682826113a8565b600181815481106107e057600080fd5b9060005260206000200160009150905080546107fb90610fc9565b80601f016020809104026020016040519081016040528092919081815260200182805461082790610fc9565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b505050505081565b600280546107fb90610fc9565b6040516000906064906001907fd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd908490a4565b600380546107fb90610fc9565b6000805460ff161561094a57606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109459190610f6c565b905090565b504390565b828054828255906000526020600020908101928215610995579160200282015b82811115610995578251829061098590826113a8565b509160200191906001019061096f565b506109a19291506109a5565b5090565b808211156109a15760006109b982826109c2565b506001016109a5565b5080546109ce90610fc9565b6000825580601f106109de575050565b601f0160209004906000526020600020908101906109fc91906109ff565b50565b5b808211156109a15760008155600101610a00565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610a8a57610a8a610a14565b604052919050565b600067ffffffffffffffff821115610aac57610aac610a14565b5060051b60200190565b600067ffffffffffffffff821115610ad057610ad0610a14565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112610b0d57600080fd5b8135610b20610b1b82610ab6565b610a43565b818152846020838601011115610b3557600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215610b6557600080fd5b823567ffffffffffffffff80821115610b7d57600080fd5b818501915085601f830112610b9157600080fd5b8135610b9f610b1b82610a92565b81815260059190911b83018401908481019088831115610bbe57600080fd5b8585015b83811015610bf657803585811115610bda5760008081fd5b610be88b89838a0101610afc565b845250918601918601610bc2565b5098975050505050505050565b60008060408385031215610c1657600080fd5b82359150602083013567ffffffffffffffff811115610c3457600080fd5b610c4085828601610afc565b9150509250929050565b60005b83811015610c65578181015183820152602001610c4d565b50506000910152565b60008151808452610c86816020860160208601610c4a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8215158152604060208201526000610cd36040830184610c6e565b949350505050565b60008060408385031215610cee57600080fd5b823567ffffffffffffffff80821115610d0657600080fd5b908401906101008287031215610d1b57600080fd5b90925060208401359080821115610d3157600080fd5b50610c4085828601610afc565b60008060208385031215610d5157600080fd5b823567ffffffffffffffff80821115610d6957600080fd5b818501915085601f830112610d7d57600080fd5b813581811115610d8c57600080fd5b866020828501011115610d9e57600080fd5b60209290920196919550909350505050565b60008060408385031215610dc357600080fd5b823567ffffffffffffffff80821115610ddb57600080fd5b818501915085601f830112610def57600080fd5b81356020610dff610b1b83610a92565b82815260059290921b84018101918181019089841115610e1e57600080fd5b8286015b84811015610e5657803586811115610e3a5760008081fd5b610e488c86838b0101610afc565b845250918301918301610e22565b5096505086013592505080821115610d3157600080fd5b600060208284031215610e7f57600080fd5b813567ffffffffffffffff811115610e9657600080fd5b610cd384828501610afc565b600060208284031215610eb457600080fd5b5035919050565b602081526000610ece6020830184610c6e565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610f0a57600080fd5b83018035915067ffffffffffffffff821115610f2557600080fd5b6020019150600581901b360382131561025357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215610f7e57600080fd5b5051919050565b805173ffffffffffffffffffffffffffffffffffffffff81168114610fa957600080fd5b919050565b600060208284031215610fc057600080fd5b610ece82610f85565b600181811c90821680610fdd57607f821691505b602082108103611016577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000815461102981610fc9565b808552602060018381168015611046576001811461107e576110ac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b89010195506110ac565b866000528260002060005b858110156110a45781548a8201860152908301908401611089565b890184019650505b505050505092915050565b60a0815260006110ca60a083018861101c565b6020838203818501528188548084528284019150828160051b8501018a6000528360002060005b8381101561113c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087840301855261112a838361101c565b948601949250600191820191016110f1565b50508681036040880152611150818b61101c565b945050505050846060840152828103608084015261116e8185610c6e565b98975050505050505050565b6000806000806080858703121561119057600080fd5b84519350602085015192506111a760408601610f85565b6060959095015193969295505050565b6000602082840312156111c957600080fd5b815167ffffffffffffffff8111156111e057600080fd5b8201601f810184136111f157600080fd5b80516111ff610b1b82610ab6565b81815285602083850101111561121457600080fd5b611225826020830160208601610c4a565b95945050505050565b80820180821115611268577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b86815285602082015273ffffffffffffffffffffffffffffffffffffffff8516604082015283606082015260c0608082015260006112af60c0830185610c6e565b82810360a08401526112c18185610c6e565b9998505050505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015611343577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018552611331868351610c6e565b955093820193908201906001016112f7565b5050858403818701525050506112258185610c6e565b601f8211156113a357600081815260208120601f850160051c810160208610156113805750805b601f850160051c820191505b8181101561139f5782815560010161138c565b5050505b505050565b815167ffffffffffffffff8111156113c2576113c2610a14565b6113d6816113d08454610fc9565b84611359565b602080601f83116001811461142957600084156113f35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561139f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147657888601518255948401946001909101908401611457565b50858210156114b257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000810000a307834353534343832643535353334343264343135323432343935343532353534643264353434353533353434653435353430303030303030303030303030303030", } var LogTriggeredStreamsLookupABI = LogTriggeredStreamsLookupMetaData.ABI @@ -461,6 +461,122 @@ func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupTransactorSession) St return _LogTriggeredStreamsLookup.Contract.Start(&_LogTriggeredStreamsLookup.TransactOpts) } +type LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator struct { + Event *LogTriggeredStreamsLookupIgnoringErrorHandlerData + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LogTriggeredStreamsLookupIgnoringErrorHandlerData) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LogTriggeredStreamsLookupIgnoringErrorHandlerData) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator) Error() error { + return it.fail +} + +func (it *LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LogTriggeredStreamsLookupIgnoringErrorHandlerData struct { + Raw types.Log +} + +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupFilterer) FilterIgnoringErrorHandlerData(opts *bind.FilterOpts) (*LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator, error) { + + logs, sub, err := _LogTriggeredStreamsLookup.contract.FilterLogs(opts, "IgnoringErrorHandlerData") + if err != nil { + return nil, err + } + return &LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator{contract: _LogTriggeredStreamsLookup.contract, event: "IgnoringErrorHandlerData", logs: logs, sub: sub}, nil +} + +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupFilterer) WatchIgnoringErrorHandlerData(opts *bind.WatchOpts, sink chan<- *LogTriggeredStreamsLookupIgnoringErrorHandlerData) (event.Subscription, error) { + + logs, sub, err := _LogTriggeredStreamsLookup.contract.WatchLogs(opts, "IgnoringErrorHandlerData") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LogTriggeredStreamsLookupIgnoringErrorHandlerData) + if err := _LogTriggeredStreamsLookup.contract.UnpackLog(event, "IgnoringErrorHandlerData", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookupFilterer) ParseIgnoringErrorHandlerData(log types.Log) (*LogTriggeredStreamsLookupIgnoringErrorHandlerData, error) { + event := new(LogTriggeredStreamsLookupIgnoringErrorHandlerData) + if err := _LogTriggeredStreamsLookup.contract.UnpackLog(event, "IgnoringErrorHandlerData", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type LogTriggeredStreamsLookupLimitOrderExecutedIterator struct { Event *LogTriggeredStreamsLookupLimitOrderExecuted @@ -746,6 +862,8 @@ type CheckErrorHandler struct { func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookup) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _LogTriggeredStreamsLookup.abi.Events["IgnoringErrorHandlerData"].ID: + return _LogTriggeredStreamsLookup.ParseIgnoringErrorHandlerData(log) case _LogTriggeredStreamsLookup.abi.Events["LimitOrderExecuted"].ID: return _LogTriggeredStreamsLookup.ParseLimitOrderExecuted(log) case _LogTriggeredStreamsLookup.abi.Events["PerformingLogTriggerUpkeep"].ID: @@ -756,6 +874,10 @@ func (_LogTriggeredStreamsLookup *LogTriggeredStreamsLookup) ParseLog(log types. } } +func (LogTriggeredStreamsLookupIgnoringErrorHandlerData) Topic() common.Hash { + return common.HexToHash("0x4f11cf8b97a2a25842c70eb74501fde8edea68ca2884190c1e3d26c8850441fe") +} + func (LogTriggeredStreamsLookupLimitOrderExecuted) Topic() common.Hash { return common.HexToHash("0xd1ffe9e45581c11d7d9f2ed5f75217cd4be9f8b7eee6af0f6d03f46de53956cd") } @@ -801,6 +923,12 @@ type LogTriggeredStreamsLookupInterface interface { Start(opts *bind.TransactOpts) (*types.Transaction, error) + FilterIgnoringErrorHandlerData(opts *bind.FilterOpts) (*LogTriggeredStreamsLookupIgnoringErrorHandlerDataIterator, error) + + WatchIgnoringErrorHandlerData(opts *bind.WatchOpts, sink chan<- *LogTriggeredStreamsLookupIgnoringErrorHandlerData) (event.Subscription, error) + + ParseIgnoringErrorHandlerData(log types.Log) (*LogTriggeredStreamsLookupIgnoringErrorHandlerData, error) + FilterLimitOrderExecuted(opts *bind.FilterOpts, orderId []*big.Int, amount []*big.Int, exchange []common.Address) (*LogTriggeredStreamsLookupLimitOrderExecutedIterator, error) WatchLimitOrderExecuted(opts *bind.WatchOpts, sink chan<- *LogTriggeredStreamsLookupLimitOrderExecuted, orderId []*big.Int, amount []*big.Int, exchange []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 5d847261a6f..b4df3298cfd 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -46,7 +46,7 @@ keeper_registry_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistry2_1/Keep keeper_registry_wrapper_2_2: ../../contracts/solc/v0.8.16/AutomationRegistry2_2/AutomationRegistry2_2.abi ../../contracts/solc/v0.8.16/AutomationRegistry2_2/AutomationRegistry2_2.bin 8f1c6d3eddf36201a556a101350abd6eb733d4c3177da2ddb5eca0d24d9a88ef keepers_vrf_consumer: ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.abi ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.bin fa75572e689c9e84705c63e8dbe1b7b8aa1a8fe82d66356c4873d024bb9166e8 log_emitter: ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.abi ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.bin 4b129ab93432c95ff9143f0631323e189887668889e0b36ccccf18a571e41ccf -log_triggered_streams_lookup_wrapper: ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.abi ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.bin fc137b8758ab155e539a65737a0c7510b01558aa9a7da205addcecf26c5f45ad +log_triggered_streams_lookup_wrapper: ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.abi ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.bin 920fff3b662909f12ed11b47d168036ffa74ad52070a94e2fa26cdad5e428b4e log_upkeep_counter_wrapper: ../../contracts/solc/v0.8.6/LogUpkeepCounter/LogUpkeepCounter.abi ../../contracts/solc/v0.8.6/LogUpkeepCounter/LogUpkeepCounter.bin 42426bbb83f96dfbe55fc576d6c65020eaeed690e2289cf99b0c4aa810a5f4ec mock_aggregator_proxy: ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.abi ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.bin b16c108f3dd384c342ddff5e94da7c0a8d39d1be5e3d8f2cf61ecc7f0e50ff42 mock_ethlink_aggregator_wrapper: ../../contracts/solc/v0.6/MockETHLINKAggregator/MockETHLINKAggregator.abi ../../contracts/solc/v0.6/MockETHLINKAggregator/MockETHLINKAggregator.bin 1c52c24f797b8482aa12b8251dcea1c072827bd5b3426b822621261944b99ca0 From 9c2240289d7e2f1fd5f0bf6cdb7b0bb826f4efcd Mon Sep 17 00:00:00 2001 From: amirylm Date: Thu, 22 Feb 2024 17:13:01 +0200 Subject: [PATCH 08/13] lint --- .../evmregistry/v21/mercury/v02/v02_request_test.go | 1 + .../ocr2keeper/evmregistry/v21/mercury/v03/request.go | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go index 2a5483c9a29..f9d1ce4cf84 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/v02_request_test.go @@ -12,6 +12,7 @@ import ( "time" automationTypes "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" + "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go index 279034d1421..edf530a52ab 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go @@ -10,13 +10,13 @@ import ( "strings" "time" - "github.com/avast/retry-go/v4" - "github.com/ethereum/go-ethereum/common/hexutil" - automationTypes "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/smartcontractkit/chainlink-common/pkg/services" + "github.com/avast/retry-go/v4" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury" From 051e0ff9fedf8d68c6145b37a1f9a8a56722c4e6 Mon Sep 17 00:00:00 2001 From: amirylm Date: Thu, 22 Feb 2024 20:18:57 +0200 Subject: [PATCH 09/13] use startBlock instead of 1 --- core/services/ocr2/plugins/ocr2keeper/integration_21_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 597535944b7..6155e362093 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -478,6 +478,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner)) require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner)) + startBlock := backend.Blockchain().CurrentBlock().Number.Int64() // start emitting events in a separate go-routine // feed lookup relies on a single contract event log to perform multiple // listener contracts @@ -498,11 +499,11 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { idsToCheck = append(idsToCheck, uid) } } - errHandlerListener, errHandlerDone := listenEvents(t, backend, addrsToCheck, topic, int64(1), 1) + errHandlerListener, errHandlerDone := listenEvents(t, backend, addrsToCheck, topic, startBlock, 1) g.Eventually(errHandlerListener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) errHandlerDone() - listener, done := listenPerformed(t, backend, registry, idsToCheck, int64(1)) + listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock) g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) done() } From 5b18f3bd429a7848d64367a61eaae1c1f725abb5 Mon Sep 17 00:00:00 2001 From: amirylm Date: Thu, 22 Feb 2024 20:20:37 +0200 Subject: [PATCH 10/13] add missing arg --- integration-tests/contracts/contract_deployer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/contracts/contract_deployer.go b/integration-tests/contracts/contract_deployer.go index 2acc0a2109e..2927293177a 100644 --- a/integration-tests/contracts/contract_deployer.go +++ b/integration-tests/contracts/contract_deployer.go @@ -1392,7 +1392,7 @@ func (e *EthereumContractDeployer) DeployAutomationLogTriggeredStreamsLookupUpke backend bind.ContractBackend, ) (common.Address, *types.Transaction, interface{}, error) { return log_triggered_streams_lookup_wrapper.DeployLogTriggeredStreamsLookup( - auth, backend, false, false, + auth, backend, false, false, false, ) }) if err != nil { From 0bcbe193be28664bb789704222823fabcd8704fa Mon Sep 17 00:00:00 2001 From: amirylm Date: Fri, 23 Feb 2024 00:40:49 +0200 Subject: [PATCH 11/13] check multiple responses: - server timeout - unauthorized - bad req - internal server err - not found --- .../plugins/ocr2keeper/integration_21_test.go | 95 +++++++++++-------- 1 file changed, 54 insertions(+), 41 deletions(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 6155e362093..098398e66d8 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -2,14 +2,16 @@ package ocr2keeper_test import ( "context" - "crypto/rand" + crand "crypto/rand" "encoding/hex" "encoding/json" "fmt" "math/big" + "math/rand" "net/http" "strings" "sync" + "sync/atomic" "testing" "time" @@ -60,7 +62,7 @@ import ( func TestFilterNamesFromSpec21(t *testing.T) { b := make([]byte, 20) - _, err := rand.Read(b) + _, err := crand.Read(b) require.NoError(t, err) address := common.HexToAddress(hexutil.Encode(b)) @@ -415,48 +417,39 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner) - const upkeepCount = 10 - const mercuryFailRounds = 7 - const mercuryFailCount = upkeepCount * 3 * mercuryFailRounds - - // testing with the mercury server involves mocking responses. currently, - // there is not a way to connect a mercury call to an upkeep id (though we - // could add custom headers) so the test must be fairly basic and just - // count calls before switching to successes - var ( - mu sync.Mutex - count int - ) - - mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { - mu.Lock() - defer mu.Unlock() - - count++ - - _ = r.ParseForm() - - t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) + upkeepCount := 10 - for key, value := range r.Form { - t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) - } - - // the streams lookup retries against the remote server 3 times before - // returning a result as retryable. - // the simulation here should force the streams lookup process to return - // retryable 2 times. - // the total count of failures should be (upkeepCount * 3 * tryCount) - if count <= mercuryFailCount { - w.WriteHeader(http.StatusNotFound) - return + respTimeout := -1 + errResponses := []int{ + respTimeout, + http.StatusUnauthorized, + http.StatusBadRequest, + http.StatusInternalServerError, + } + // inline retries (3) * retry rounds (6) + timeout round (1) + mercuryFailCountPerUpkeep := 3*6 + 1 + // mercuryFailCount is the number of times the mercury server will return an + // error before returning a success + mercuryFailCount := 2 + (mercuryFailCountPerUpkeep * 3) + for i := 3; i < mercuryFailCount; i++ { + errResponses = append(errResponses, http.StatusNotFound) + } + startMercuryServer(t, mercuryServer, func(i int) (int, []byte) { + if i < len(errResponses) { + resp := errResponses[i] + switch resp { + case http.StatusNotFound, http.StatusInternalServerError: + // in case we got a 404 or 500, we wait a bit to simulate real behavior + time.Sleep(time.Duration(rand.Intn(2500)) * time.Millisecond) + case respTimeout: // mercury server timeout + time.Sleep(60 * time.Second) // 60s is the default timeout + resp = http.StatusNotFound + default: + } + return resp, nil } - - // start sending success messages output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` - - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte(output)) + return http.StatusOK, []byte(output) }) defer mercuryServer.Stop() @@ -508,6 +501,25 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { done() } +func startMercuryServer(t *testing.T, mercuryServer *SimulatedMercuryServer, responder func(i int) (int, []byte)) { + i := atomic.Int32{} + mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { + _ = r.ParseForm() + t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI) + for key, value := range r.Form { + t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value) + } + + ii := int(i.Load()) + i.Add(1) + status, body := responder(ii) + w.WriteHeader(status) + if len(body) > 0 { + _, _ = w.Write(body) + } + }) +} + func listenEvents(t *testing.T, backend *backends.SimulatedBackend, addrs []common.Address, topic common.Hash, startBlock int64, count int) (func() bool, func()) { ctx, cancel := context.WithCancel(testutils.Context(t)) visited := make(map[string]bool) @@ -536,6 +548,7 @@ func listenEvents(t *testing.T, backend *backends.SimulatedBackend, addrs []comm continue } visited[visitedID] = true + t.Logf("found err handler log in block %d [%s]", log.BlockNumber, log.BlockHash.Hex()) cacheID := log.Address.Hex() count, ok := cache.Load(cacheID) if !ok { From 360a14bb4015e80075a0bf779cf0e7302b69145f Mon Sep 17 00:00:00 2001 From: amirylm Date: Sun, 25 Feb 2024 12:29:30 +0200 Subject: [PATCH 12/13] fix test --- .../v21/mercury/streams/streams.go | 2 + .../plugins/ocr2keeper/integration_21_test.go | 94 +++++-------------- 2 files changed, 26 insertions(+), 70 deletions(-) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go index f057afcd74d..87ac58a79c6 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go @@ -276,6 +276,8 @@ func (s *streams) DoMercuryRequest(ctx context.Context, lookup *mercury.StreamsL } func (s *streams) CheckErrorHandler(ctx context.Context, errCode encoding.ErrCode, lookup *mercury.StreamsLookup, checkResults []ocr2keepers.CheckResult, i int) error { + s.lggr.Debugf("at block %d upkeep %s requested time %s CheckErrorHandler error code: %d", lookup.Block, lookup.UpkeepId, lookup.Time, errCode) + userPayload, err := s.packer.PackUserCheckErrorHandler(errCode, lookup.ExtraData) if err != nil { checkResults[i].Retryable = false diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 098398e66d8..b2a1a8df00c 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "math/big" - "math/rand" "net/http" "strings" "sync" @@ -15,7 +14,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" @@ -421,35 +419,28 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { respTimeout := -1 errResponses := []int{ - respTimeout, + // respTimeout, // TODO: uncomment once mercuryServer is fixed http.StatusUnauthorized, http.StatusBadRequest, http.StatusInternalServerError, } - // inline retries (3) * retry rounds (6) + timeout round (1) - mercuryFailCountPerUpkeep := 3*6 + 1 - // mercuryFailCount is the number of times the mercury server will return an - // error before returning a success - mercuryFailCount := 2 + (mercuryFailCountPerUpkeep * 3) - for i := 3; i < mercuryFailCount; i++ { - errResponses = append(errResponses, http.StatusNotFound) - } startMercuryServer(t, mercuryServer, func(i int) (int, []byte) { + var resp int if i < len(errResponses) { - resp := errResponses[i] - switch resp { - case http.StatusNotFound, http.StatusInternalServerError: - // in case we got a 404 or 500, we wait a bit to simulate real behavior - time.Sleep(time.Duration(rand.Intn(2500)) * time.Millisecond) - case respTimeout: // mercury server timeout - time.Sleep(60 * time.Second) // 60s is the default timeout - resp = http.StatusNotFound - default: - } - return resp, nil + resp = errResponses[i] } - output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}` - return http.StatusOK, []byte(output) + switch resp { + case http.StatusNotFound, http.StatusInternalServerError: + // TODO: uncomment once mercuryServer is fixed + // in case we got a 404 or 500, wait a bit to simulate real world + // time.Sleep(time.Duration(rand.Intn(2500)) * time.Millisecond) + case respTimeout: // mercury server timeout + time.Sleep(30 * time.Second) + resp = http.StatusNotFound + default: + resp = http.StatusNotFound + } + return resp, nil }) defer mercuryServer.Stop() @@ -483,18 +474,14 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { }) }() - topic := log_triggered_streams_lookup_wrapper.LogTriggeredStreamsLookupIgnoringErrorHandlerData{}.Topic() - addrsToCheck := make([]common.Address, 0) + go makeDummyBlocks(t, backend, 3*time.Second, 1000) + idsToCheck := make([]*big.Int, 0) for i, uid := range feeds.UpkeepsIds() { if checkResultsProvider(i) { - addrsToCheck = append(addrsToCheck, feeds.addresses[i]) idsToCheck = append(idsToCheck, uid) } } - errHandlerListener, errHandlerDone := listenEvents(t, backend, addrsToCheck, topic, startBlock, 1) - g.Eventually(errHandlerListener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) - errHandlerDone() listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock) g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue()) @@ -520,49 +507,16 @@ func startMercuryServer(t *testing.T, mercuryServer *SimulatedMercuryServer, res }) } -func listenEvents(t *testing.T, backend *backends.SimulatedBackend, addrs []common.Address, topic common.Hash, startBlock int64, count int) (func() bool, func()) { - ctx, cancel := context.WithCancel(testutils.Context(t)) - visited := make(map[string]bool) - cache := &sync.Map{} - start := startBlock - +func makeDummyBlocks(t *testing.T, backend *backends.SimulatedBackend, interval time.Duration, count int) { go func() { - for ctx.Err() == nil { - currentBlock := backend.Blockchain().CurrentBlock().Number - logs, err := backend.FilterLogs(ctx, ethereum.FilterQuery{ - Addresses: addrs, - Topics: [][]common.Hash{{topic}}, - FromBlock: currentBlock, - ToBlock: big.NewInt(start), - }) - if err != nil { - if ctx.Err() != nil { - return - } - t.Logf("Error fetching logs: %v", err) - continue - } - for _, log := range logs { - visitedID := fmt.Sprintf("%s:%s:%d", log.BlockHash.Hex(), log.TxHash.Hex(), log.Index) - if visited[visitedID] { - continue - } - visited[visitedID] = true - t.Logf("found err handler log in block %d [%s]", log.BlockNumber, log.BlockHash.Hex()) - cacheID := log.Address.Hex() - count, ok := cache.Load(cacheID) - if !ok { - cache.Store(cacheID, 1) - continue - } - countI := count.(int) - cache.Store(cacheID, countI+1) - } - time.Sleep(time.Second) + ctx, cancel := context.WithCancel(testutils.Context(t)) + defer cancel() + + for i := 0; i < count && ctx.Err() == nil; i++ { + backend.Commit() + time.Sleep(interval) } }() - - return mapListener(cache, count), cancel } func emitEvents(ctx context.Context, t *testing.T, n int, contracts []*log_upkeep_counter_wrapper.LogUpkeepCounter, carrol *bind.TransactOpts, afterEmit func()) { From 9ee15689de9e9b7530bb678ba6619814b87f110b Mon Sep 17 00:00:00 2001 From: amirylm Date: Sun, 25 Feb 2024 12:55:38 +0200 Subject: [PATCH 13/13] cleanup --- .../evmregistry/v21/mercury/testutils.go | 72 ++++++++++++++++ .../plugins/ocr2keeper/integration_21_test.go | 19 ++--- .../plugins/ocr2keeper/integration_test.go | 83 ++----------------- 3 files changed, 83 insertions(+), 91 deletions(-) create mode 100644 core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/testutils.go diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/testutils.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/testutils.go new file mode 100644 index 00000000000..df64cf3bcee --- /dev/null +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/testutils.go @@ -0,0 +1,72 @@ +package mercury + +import ( + "net/http" + "net/http/httptest" + "sync/atomic" +) + +type MercuryEndpointMock interface { + URL() string + Username() string + Password() string + CallCount() int + RegisterHandler(http.HandlerFunc) +} + +var _ MercuryEndpointMock = &SimulatedMercuryServer{} + +var notFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) +}) + +type SimulatedMercuryServer struct { + server *httptest.Server + handler http.HandlerFunc + + callCounter atomic.Int32 +} + +func NewSimulatedMercuryServer() *SimulatedMercuryServer { + srv := &SimulatedMercuryServer{ + handler: notFoundHandler, + callCounter: atomic.Int32{}, + } + + srv.server = httptest.NewUnstartedServer(srv) + + return srv +} + +func (ms *SimulatedMercuryServer) URL() string { + return ms.server.URL +} + +func (ms *SimulatedMercuryServer) Username() string { + return "username1" +} + +func (ms *SimulatedMercuryServer) Password() string { + return "password1" +} + +func (ms *SimulatedMercuryServer) CallCount() int { + return int(ms.callCounter.Load()) +} + +func (ms *SimulatedMercuryServer) RegisterHandler(h http.HandlerFunc) { + ms.handler = h +} + +func (ms *SimulatedMercuryServer) Start() { + ms.server.Start() +} + +func (ms *SimulatedMercuryServer) Stop() { + ms.server.Close() +} + +func (ms *SimulatedMercuryServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ms.callCounter.Add(1) + ms.handler.ServeHTTP(w, r) +} diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index b2a1a8df00c..4aa9b0cb7dc 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -54,6 +54,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" ) @@ -417,9 +418,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { upkeepCount := 10 - respTimeout := -1 errResponses := []int{ - // respTimeout, // TODO: uncomment once mercuryServer is fixed http.StatusUnauthorized, http.StatusBadRequest, http.StatusInternalServerError, @@ -429,15 +428,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { if i < len(errResponses) { resp = errResponses[i] } - switch resp { - case http.StatusNotFound, http.StatusInternalServerError: - // TODO: uncomment once mercuryServer is fixed - // in case we got a 404 or 500, wait a bit to simulate real world - // time.Sleep(time.Duration(rand.Intn(2500)) * time.Millisecond) - case respTimeout: // mercury server timeout - time.Sleep(30 * time.Second) - resp = http.StatusNotFound - default: + if resp == 0 { resp = http.StatusNotFound } return resp, nil @@ -488,7 +479,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { done() } -func startMercuryServer(t *testing.T, mercuryServer *SimulatedMercuryServer, responder func(i int) (int, []byte)) { +func startMercuryServer(t *testing.T, mercuryServer *mercury.SimulatedMercuryServer, responder func(i int) (int, []byte)) { i := atomic.Int32{} mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) { _ = r.ParseForm() @@ -595,9 +586,9 @@ func listenPerformed(t *testing.T, backend *backends.SimulatedBackend, registry return listenPerformedN(t, backend, registry, ids, startBlock, 0) } -func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IKeeperRegistryMaster, backend *backends.SimulatedBackend, usr *bind.TransactOpts) ([]Node, *SimulatedMercuryServer) { +func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IKeeperRegistryMaster, backend *backends.SimulatedBackend, usr *bind.TransactOpts) ([]Node, *mercury.SimulatedMercuryServer) { lggr := logger.TestLogger(t) - mServer := NewSimulatedMercuryServer() + mServer := mercury.NewSimulatedMercuryServer() mServer.Start() // Setup bootstrap + oracle nodes diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index 56467c60abb..937c3df0c36 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -6,10 +6,7 @@ import ( "encoding/json" "fmt" "math/big" - "net/http" - "net/http/httptest" "strings" - "sync" "testing" "time" @@ -57,6 +54,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/keystest" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate" "github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" @@ -112,7 +110,7 @@ func setupNode( nodeKey ethkey.KeyV2, backend *backends.SimulatedBackend, p2pV2Bootstrappers []commontypes.BootstrapperLocator, - mercury MercuryEndpoint, + mercury mercury.MercuryEndpointMock, ) (chainlink.Application, string, common.Address, ocr2key.KeyBundle) { p2pKey := keystest.NewP2PKeyV2(t) p2paddresses := []string{fmt.Sprintf("127.0.0.1:%d", port)} @@ -236,7 +234,7 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { // Setup bootstrap + oracle nodes bootstrapNodePort := freeport.GetOne(t) - appBootstrap, bootstrapPeerID, bootstrapTransmitter, bootstrapKb := setupNode(t, bootstrapNodePort, nodeKeys[0], backend, nil, NewSimulatedMercuryServer()) + appBootstrap, bootstrapPeerID, bootstrapTransmitter, bootstrapKb := setupNode(t, bootstrapNodePort, nodeKeys[0], backend, nil, mercury.NewSimulatedMercuryServer()) bootstrapNode := Node{ appBootstrap, bootstrapTransmitter, bootstrapKb, } @@ -250,7 +248,7 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { app, peerID, transmitter, kb := setupNode(t, ports[i], nodeKeys[i+1], backend, []commontypes.BootstrapperLocator{ // Supply the bootstrap IP and port as a V2 peer address {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}}, - }, NewSimulatedMercuryServer()) + }, mercury.NewSimulatedMercuryServer()) nodes = append(nodes, Node{ app, transmitter, kb, @@ -488,7 +486,7 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { effectiveTransmitters := make([]common.Address, 0) // Setup bootstrap + oracle nodes bootstrapNodePort := freeport.GetOne(t) - appBootstrap, bootstrapPeerID, bootstrapTransmitter, bootstrapKb := setupNode(t, bootstrapNodePort, nodeKeys[0], backend, nil, NewSimulatedMercuryServer()) + appBootstrap, bootstrapPeerID, bootstrapTransmitter, bootstrapKb := setupNode(t, bootstrapNodePort, nodeKeys[0], backend, nil, mercury.NewSimulatedMercuryServer()) bootstrapNode := Node{ appBootstrap, bootstrapTransmitter, bootstrapKb, @@ -503,7 +501,7 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { app, peerID, transmitter, kb := setupNode(t, ports[i], nodeKeys[i+1], backend, []commontypes.BootstrapperLocator{ // Supply the bootstrap IP and port as a V2 peer address {PeerID: bootstrapPeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}}, - }, NewSimulatedMercuryServer()) + }, mercury.NewSimulatedMercuryServer()) nodeForwarder := setupForwarderForNode(t, app, sergey, backend, transmitter, linkAddr) effectiveTransmitters = append(effectiveTransmitters, nodeForwarder) @@ -711,72 +709,3 @@ func TestFilterNamesFromSpec20(t *testing.T) { _, err = ocr2keeper.FilterNamesFromSpec20(spec) require.ErrorContains(t, err, "not a valid EIP55 formatted address") } - -// ------- below this line could be added to a test helpers package -type MercuryEndpoint interface { - URL() string - Username() string - Password() string - CallCount() int - RegisterHandler(http.HandlerFunc) -} - -type SimulatedMercuryServer struct { - server *httptest.Server - handler http.HandlerFunc - - mu sync.RWMutex - callCount int -} - -func NewSimulatedMercuryServer() *SimulatedMercuryServer { - srv := &SimulatedMercuryServer{ - handler: func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - }, - } - - srv.server = httptest.NewUnstartedServer(srv) - - return srv -} - -func (ms *SimulatedMercuryServer) URL() string { - return ms.server.URL -} - -func (ms *SimulatedMercuryServer) Username() string { - return "username1" -} - -func (ms *SimulatedMercuryServer) Password() string { - return "password1" -} - -func (ms *SimulatedMercuryServer) CallCount() int { - ms.mu.RLock() - defer ms.mu.RUnlock() - - return ms.callCount -} - -func (ms *SimulatedMercuryServer) RegisterHandler(h http.HandlerFunc) { - ms.handler = h -} - -func (ms *SimulatedMercuryServer) Start() { - ms.server.Start() -} - -func (ms *SimulatedMercuryServer) Stop() { - ms.server.Close() -} - -func (ms *SimulatedMercuryServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { - ms.mu.Lock() - defer ms.mu.Unlock() - - ms.callCount++ - - ms.handler.ServeHTTP(w, r) -}