From e00693e6de2a7ecda910cd1c8a9a6e93ebe97975 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 14 May 2024 20:22:53 -0700 Subject: [PATCH 01/30] Re-run make generate, fix fluxmonitorv2 & ocr2keeper tests --- .../functions_allow_list.go | 2 +- .../functions_coordinator.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 4 +- .../keystone/generated/forwarder/forwarder.go | 204 ++---------------- ...rapper-dependency-versions-do-not-edit.txt | 4 - ...rapper-dependency-versions-do-not-edit.txt | 2 +- .../fluxmonitorv2/integrations_test.go | 1 + .../plugins/ocr2keeper/integration_21_test.go | 27 ++- go.mod | 2 +- 9 files changed, 36 insertions(+), 212 deletions(-) delete mode 100644 core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt diff --git a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go index 2f98ae1623d..023956b7314 100644 --- a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go +++ b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go @@ -37,7 +37,7 @@ type TermsOfServiceAllowListConfig struct { var TermsOfServiceAllowListMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"initialAllowedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"initialBlockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"AddedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"BlockedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"UnblockedAccess\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"allowedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getBlockedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"blockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b5060405162001a1e38038062001a1e8339810160408190526200003491620004d9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001d4565b505050620000d2836200027f60201b60201c565b60005b8251811015620001255762000111838281518110620000f857620000f8620005a8565b602002602001015160026200030660201b90919060201c565b506200011d81620005be565b9050620000d5565b5060005b8151811015620001ca57620001658282815181106200014c576200014c620005a8565b602002602001015160026200032660201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68282815181106200019d576200019d620005a8565b602002602001015160046200030660201b90919060201c565b50620001c281620005be565b905062000129565b50505050620005e6565b336001600160a01b038216036200022e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200028962000349565b805160068054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200031d836001600160a01b038416620003a7565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200031d565b6000546001600160a01b03163314620003a55760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620003f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000320565b50600062000320565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200042757600080fd5b919050565b600082601f8301126200043e57600080fd5b815160206001600160401b03808311156200045d576200045d620003f9565b8260051b604051601f19603f83011681018181108482111715620004855762000485620003f9565b604052938452858101830193838101925087851115620004a457600080fd5b83870191505b84821015620004ce57620004be826200040f565b83529183019190830190620004aa565b979650505050505050565b60008060008385036080811215620004f057600080fd5b6040811215620004ff57600080fd5b50604080519081016001600160401b038082118383101715620005265762000526620003f9565b816040528651915081151582146200053d57600080fd5b8183526200054e602088016200040f565b60208401526040870151929550808311156200056957600080fd5b62000577888489016200042c565b945060608701519250808311156200058e57600080fd5b50506200059e868287016200042c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620005df57634e487b7160e01b600052601160045260246000fd5b5060010190565b61142880620005f66000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102c3578063cc7ebf4914610322578063f2fde38b1461032a57600080fd5b8063a39b06e314610237578063a5e1d61d146102b057600080fd5b8063817ef62e146101e157806382184c7b146101e957806389f9a2c4146101fc5780638da5cb5b1461020f57600080fd5b80633908c4d4116100ee5780633908c4d41461018e57806347663acb146101a35780636b14daf8146101b657806379ba5097146101d957600080fd5b806301a05958146101205780630a8c9c2414610146578063181f5a771461016657806320229a861461017b575b600080fd5b61012861033d565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610159610154366004610fc4565b61034e565b60405161013d9190610ff7565b61016e6104aa565b60405161013d9190611051565b610159610189366004610fc4565b6104c6565b6101a161019c3660046110e1565b61062c565b005b6101a16101b1366004611142565b6108d7565b6101c96101c436600461115d565b610938565b604051901515815260200161013d565b6101a1610962565b610159610a64565b6101a16101f7366004611142565b610a70565b6101a161020a36600461120f565b610ad6565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013d565b6102a2610245366004611298565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b60405190815260200161013d565b6101c96102be366004611142565b610b91565b60408051808201825260008082526020918201528151808301835260065460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff61010090920482169284019283528451908152915116918101919091520161013d565b610128610bb1565b6101a1610338366004611142565b610bbd565b60006103496004610bd1565b905090565b60608167ffffffffffffffff168367ffffffffffffffff16118061038557506103776002610bd1565b8267ffffffffffffffff1610155b156103bc576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c683836112f1565b6103d1906001611312565b67ffffffffffffffff1667ffffffffffffffff8111156103f3576103f36111e0565b60405190808252806020026020018201604052801561041c578160200160208202803683370190505b50905060005b61042c84846112f1565b67ffffffffffffffff1681116104a25761045b6104538267ffffffffffffffff8716611333565b600290610bdb565b82828151811061046d5761046d611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261049b81611375565b9050610422565b505b92915050565b6040518060600160405280602c81526020016113f0602c913981565b60608167ffffffffffffffff168367ffffffffffffffff1611806104fd57506104ef6004610bd1565b8267ffffffffffffffff1610155b8061050f575061050d6004610bd1565b155b15610546576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61055083836112f1565b61055b906001611312565b67ffffffffffffffff1667ffffffffffffffff81111561057d5761057d6111e0565b6040519080825280602002602001820160405280156105a6578160200160208202803683370190505b50905060005b6105b684846112f1565b67ffffffffffffffff1681116104a2576105e56105dd8267ffffffffffffffff8716611333565b600490610bdb565b8282815181106105f7576105f7611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261062581611375565b90506105ac565b610637600485610be7565b1561066e576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206006546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107a2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16146107f9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061083e57503373ffffffffffffffffffffffffffffffffffffffff87161480159061083e5750333b155b15610875576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610880600286610c16565b156108cf5760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b6108df610c38565b6108ea600482610cbb565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b60065460009060ff1661094d5750600161095b565b610958600285610be7565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103496002610cdd565b610a78610c38565b610a83600282610cbb565b50610a8f600482610c16565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161092d565b610ade610c38565b805160068054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161092d565b60065460009060ff16610ba657506000919050565b6104a4600483610be7565b60006103496002610bd1565b610bc5610c38565b610bce81610cea565b50565b60006104a4825490565b600061095b8383610ddf565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561095b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e09565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109df565b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e58565b6060600061095b83610f4b565b3373ffffffffffffffffffffffffffffffffffffffff821603610d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109df565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610df657610df6611346565b9060005260206000200154905092915050565b6000818152600183016020526040812054610e50575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a4565b5060006104a4565b60008181526001830160205260408120548015610f41576000610e7c6001836113ad565b8554909150600090610e90906001906113ad565b9050818114610ef5576000866000018281548110610eb057610eb0611346565b9060005260206000200154905080876000018481548110610ed357610ed3611346565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610f0657610f066113c0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a4565b60009150506104a4565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f9b57602002820191906000526020600020905b815481526020019060010190808311610f87575b50505050509050919050565b803567ffffffffffffffff81168114610fbf57600080fd5b919050565b60008060408385031215610fd757600080fd5b610fe083610fa7565b9150610fee60208401610fa7565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561104557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611013565b50909695505050505050565b600060208083528351808285015260005b8181101561107e57858101830151858201604001528201611062565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610fbf57600080fd5b600080600080600060a086880312156110f957600080fd5b611102866110bd565b9450611110602087016110bd565b93506040860135925060608601359150608086013560ff8116811461113457600080fd5b809150509295509295909350565b60006020828403121561115457600080fd5b61095b826110bd565b60008060006040848603121561117257600080fd5b61117b846110bd565b9250602084013567ffffffffffffffff8082111561119857600080fd5b818601915086601f8301126111ac57600080fd5b8135818111156111bb57600080fd5b8760208285010111156111cd57600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006040828403121561122157600080fd5b6040516040810181811067ffffffffffffffff8211171561126b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235801515811461127e57600080fd5b815261128c602084016110bd565b60208201529392505050565b600080604083850312156112ab57600080fd5b6112b4836110bd565b9150610fee602084016110bd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104a2576104a26112c2565b67ffffffffffffffff8181168382160190808211156104a2576104a26112c2565b808201808211156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113a6576113a66112c2565b5060010190565b818103818111156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e30a164736f6c6343000813000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162001a3038038062001a308339810160408190526200003491620004d9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001d4565b505050620000d2836200027f60201b60201c565b60005b8251811015620001255762000111838281518110620000f857620000f8620005a8565b602002602001015160026200030660201b90919060201c565b506200011d81620005be565b9050620000d5565b5060005b8151811015620001ca57620001658282815181106200014c576200014c620005a8565b602002602001015160026200032660201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68282815181106200019d576200019d620005a8565b602002602001015160046200030660201b90919060201c565b50620001c281620005be565b905062000129565b50505050620005e6565b336001600160a01b038216036200022e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200028962000349565b805160068054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200031d836001600160a01b038416620003a7565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200031d565b6000546001600160a01b03163314620003a55760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620003f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000320565b50600062000320565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200042757600080fd5b919050565b600082601f8301126200043e57600080fd5b815160206001600160401b03808311156200045d576200045d620003f9565b8260051b604051601f19603f83011681018181108482111715620004855762000485620003f9565b604052938452858101830193838101925087851115620004a457600080fd5b83870191505b84821015620004ce57620004be826200040f565b83529183019190830190620004aa565b979650505050505050565b60008060008385036080811215620004f057600080fd5b6040811215620004ff57600080fd5b50604080519081016001600160401b038082118383101715620005265762000526620003f9565b816040528651915081151582146200053d57600080fd5b8183526200054e602088016200040f565b60208401526040870151929550808311156200056957600080fd5b62000577888489016200042c565b945060608701519250808311156200058e57600080fd5b50506200059e868287016200042c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620005df57634e487b7160e01b600052601160045260246000fd5b5060010190565b61143a80620005f66000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102c3578063cc7ebf4914610322578063f2fde38b1461032a57600080fd5b8063a39b06e314610237578063a5e1d61d146102b057600080fd5b8063817ef62e146101e157806382184c7b146101e957806389f9a2c4146101fc5780638da5cb5b1461020f57600080fd5b80633908c4d4116100ee5780633908c4d41461018e57806347663acb146101a35780636b14daf8146101b657806379ba5097146101d957600080fd5b806301a05958146101205780630a8c9c2414610146578063181f5a771461016657806320229a861461017b575b600080fd5b61012861033d565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610159610154366004610fd6565b61034e565b60405161013d9190611009565b61016e6104bc565b60405161013d9190611063565b610159610189366004610fd6565b6104d8565b6101a161019c3660046110f3565b61063e565b005b6101a16101b1366004611154565b6108e9565b6101c96101c436600461116f565b61094a565b604051901515815260200161013d565b6101a1610974565b610159610a76565b6101a16101f7366004611154565b610a82565b6101a161020a366004611221565b610ae8565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013d565b6102a26102453660046112aa565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b60405190815260200161013d565b6101c96102be366004611154565b610ba3565b60408051808201825260008082526020918201528151808301835260065460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff61010090920482169284019283528451908152915116918101919091520161013d565b610128610bc3565b6101a1610338366004611154565b610bcf565b60006103496004610be3565b905090565b60608167ffffffffffffffff168367ffffffffffffffff16118061038557506103776002610be3565b8267ffffffffffffffff1610155b8061039757506103956002610be3565b155b156103ce576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d88383611303565b6103e3906001611324565b67ffffffffffffffff1667ffffffffffffffff811115610405576104056111f2565b60405190808252806020026020018201604052801561042e578160200160208202803683370190505b50905060005b61043e8484611303565b67ffffffffffffffff1681116104b45761046d6104658267ffffffffffffffff8716611345565b600290610bed565b82828151811061047f5761047f611358565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104ad81611387565b9050610434565b505b92915050565b6040518060600160405280602c8152602001611402602c913981565b60608167ffffffffffffffff168367ffffffffffffffff16118061050f57506105016004610be3565b8267ffffffffffffffff1610155b80610521575061051f6004610be3565b155b15610558576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105628383611303565b61056d906001611324565b67ffffffffffffffff1667ffffffffffffffff81111561058f5761058f6111f2565b6040519080825280602002602001820160405280156105b8578160200160208202803683370190505b50905060005b6105c88484611303565b67ffffffffffffffff1681116104b4576105f76105ef8267ffffffffffffffff8716611345565b600490610bed565b82828151811061060957610609611358565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261063781611387565b90506105be565b610649600485610bf9565b15610680576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206006546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107b4573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161461080b576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061085057503373ffffffffffffffffffffffffffffffffffffffff8716148015906108505750333b155b15610887576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610892600286610c28565b156108e15760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b6108f1610c4a565b6108fc600482610ccd565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b60065460009060ff1661095f5750600161096d565b61096a600285610bf9565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103496002610cef565b610a8a610c4a565b610a95600282610ccd565b50610aa1600482610c28565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161093f565b610af0610c4a565b805160068054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161093f565b60065460009060ff16610bb857506000919050565b6104b6600483610bf9565b60006103496002610be3565b610bd7610c4a565b610be081610cfc565b50565b60006104b6825490565b600061096d8383610df1565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561096d565b600061096d8373ffffffffffffffffffffffffffffffffffffffff8416610e1b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109f1565b565b600061096d8373ffffffffffffffffffffffffffffffffffffffff8416610e6a565b6060600061096d83610f5d565b3373ffffffffffffffffffffffffffffffffffffffff821603610d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610e0857610e08611358565b9060005260206000200154905092915050565b6000818152600183016020526040812054610e62575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104b6565b5060006104b6565b60008181526001830160205260408120548015610f53576000610e8e6001836113bf565b8554909150600090610ea2906001906113bf565b9050818114610f07576000866000018281548110610ec257610ec2611358565b9060005260206000200154905080876000018481548110610ee557610ee5611358565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610f1857610f186113d2565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104b6565b60009150506104b6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610fad57602002820191906000526020600020905b815481526020019060010190808311610f99575b50505050509050919050565b803567ffffffffffffffff81168114610fd157600080fd5b919050565b60008060408385031215610fe957600080fd5b610ff283610fb9565b915061100060208401610fb9565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561105757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611025565b50909695505050505050565b600060208083528351808285015260005b8181101561109057858101830151858201604001528201611074565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610fd157600080fd5b600080600080600060a0868803121561110b57600080fd5b611114866110cf565b9450611122602087016110cf565b93506040860135925060608601359150608086013560ff8116811461114657600080fd5b809150509295509295909350565b60006020828403121561116657600080fd5b61096d826110cf565b60008060006040848603121561118457600080fd5b61118d846110cf565b9250602084013567ffffffffffffffff808211156111aa57600080fd5b818601915086601f8301126111be57600080fd5b8135818111156111cd57600080fd5b8760208285010111156111df57600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006040828403121561123357600080fd5b6040516040810181811067ffffffffffffffff8211171561127d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235801515811461129057600080fd5b815261129e602084016110cf565b60208201529392505050565b600080604083850312156112bd57600080fd5b6112c6836110cf565b9150611000602084016110cf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104b4576104b46112d4565b67ffffffffffffffff8181168382160190808211156104b4576104b46112d4565b808201808211156104b6576104b66112d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113b8576113b86112d4565b5060010190565b818103818111156104b6576104b66112d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e30a164736f6c6343000813000a", } var TermsOfServiceAllowListABI = TermsOfServiceAllowListMetaData.ABI diff --git a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go index 286cb1befd6..6099c541c69 100644 --- a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go +++ b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go @@ -75,7 +75,7 @@ type FunctionsResponseRequestMeta struct { var FunctionsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"linkToNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkToUsdFeed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EmptyPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentReportData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"usdLink\",\"type\":\"int256\"}],\"name\":\"InvalidUsdLinkPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoTransmittersSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"ReportInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedPublicKeyChange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedRequestDataVersion\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"CommitmentDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"callbackGasLimit\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint72\",\"name\":\"donFee\",\"type\":\"uint72\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint32\",\"name\":\"timeoutTimestamp\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structFunctionsResponse.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"name\":\"OracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"OracleResponse\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"juelsPerGas\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l1FeeShareWei\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"callbackCostJuels\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"donFeeJuels\",\"type\":\"uint72\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"adminFeeJuels\",\"type\":\"uint72\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"operationFeeJuels\",\"type\":\"uint72\"}],\"name\":\"RequestBilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"deleteCommitment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"gasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateCost\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdminFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"getDONFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOperationFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThresholdPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getUsdPerUnitLink\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleWithdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"donPublicKey\",\"type\":\"bytes\"}],\"name\":\"setDONPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"thresholdPublicKey\",\"type\":\"bytes\"}],\"name\":\"setThresholdPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"availableBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initiatedRequests\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"completedRequests\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"}],\"internalType\":\"structFunctionsResponse.RequestMeta\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"startRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint72\",\"name\":\"donFee\",\"type\":\"uint72\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint32\",\"name\":\"timeoutTimestamp\",\"type\":\"uint32\"}],\"internalType\":\"structFunctionsResponse.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200603a3803806200603a8339810160408190526200003491620004db565b83838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200014e565b5050506001600160a01b038116620000ee57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03908116608052600c80546001600160601b03166c0100000000000000000000000085841602179055600d80546001600160a01b0319169183169190911790556200014083620001f9565b505050505050505062000742565b336001600160a01b03821603620001a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620002036200039e565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff16600160f81b026001600160f81b036001600160401b03909216600160b81b02919091166001600160b81b0361ffff938416600160a81b0261ffff60a81b1964ffffffffff909616600160801b029590951666ffffffffffffff60801b1963ffffffff9788166c010000000000000000000000000263ffffffff60601b19998916680100000000000000000299909916600160401b600160801b03199b8916640100000000026001600160401b0319909d169e89169e909e179b909b17999099169b909b1795909517979097169590951717969096161792909217909255610100840151610120850151909316600160e01b026001600160e01b0390931692909217600955610140830151600a80546101608601518416620100000263ffffffff19919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a906200039390839062000639565b60405180910390a150565b620003a8620003aa565b565b6000546001600160a01b03163314620003a85760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000087565b80516001600160a01b03811681146200041e57600080fd5b919050565b60405161018081016001600160401b03811182821017156200045557634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff811681146200041e57600080fd5b805164ffffffffff811681146200041e57600080fd5b805161ffff811681146200041e57600080fd5b80516001600160401b03811681146200041e57600080fd5b805160ff811681146200041e57600080fd5b80516001600160e01b03811681146200041e57600080fd5b6000806000808486036101e0811215620004f457600080fd5b620004ff8662000406565b945061018080601f19830112156200051657600080fd5b6200052062000423565b915062000530602088016200045b565b825262000540604088016200045b565b602083015262000553606088016200045b565b604083015262000566608088016200045b565b60608301526200057960a0880162000470565b60808301526200058c60c0880162000486565b60a08301526200059f60e0880162000499565b60c0830152610100620005b4818901620004b1565b60e0840152610120620005c9818a01620004c3565b828501526101409150620005df828a016200045b565b90840152610160620005f389820162000486565b8285015262000604838a0162000486565b90840152509093506200061d90506101a0860162000406565b91506200062e6101c0860162000406565b905092959194509250565b815163ffffffff1681526101808101602083015162000660602084018263ffffffff169052565b50604083015162000679604084018263ffffffff169052565b50606083015162000692606084018263ffffffff169052565b506080830151620006ac608084018264ffffffffff169052565b5060a0830151620006c360a084018261ffff169052565b5060c0830151620006df60c08401826001600160401b03169052565b5060e0830151620006f560e084018260ff169052565b50610100838101516001600160e01b0316908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101609384015116929091019190915290565b6080516158b2620007886000396000818161079c01528181610c7d01528181610f110152818161102701528181611b2d015281816129eb015261398401526158b26000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638da5cb5b116100ee578063d227d24511610097578063e4ddcea611610071578063e4ddcea6146105d5578063f2f22ef1146105eb578063f2fde38b146105f3578063f6ea41f61461060657600080fd5b8063d227d2451461058a578063d328a91e146105ba578063e3d0e712146105c257600080fd5b8063b1dc65a4116100c8578063b1dc65a414610396578063ba9c924d146103a9578063c3f909d4146103bc57600080fd5b80638da5cb5b1461032e578063a631571e14610356578063afcb95d71461037657600080fd5b80637d4807871161015057806381f1b9381161012a57806381f1b938146102a657806381ff7048146102ae57806385b214cf1461031b57600080fd5b80637d480787146102765780637f15e1661461027e578063814118341461029157600080fd5b806366316d8d1161018157806366316d8d1461023c5780637212762f1461024f57806379ba50971461026e57600080fd5b8063083a5466146101a8578063181f5a77146101bd578063626f458c1461020f575b600080fd5b6101bb6101b636600461402b565b61060e565b005b6101f96040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e332e300000000081525081565b60405161020691906140db565b60405180910390f35b61022261021d366004614248565b610663565b60405168ffffffffffffffffff9091168152602001610206565b6101bb61024a3660046142cf565b6106a0565b610257610859565b6040805192835260ff909116602083015201610206565b6101bb610a6c565b6101bb610b69565b6101bb61028c36600461402b565b610d69565b610299610db9565b6040516102069190614359565b6101f9610e28565b6102f860015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610206565b6101bb61032936600461436c565b610ef9565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b610369610364366004614385565b610fb6565b60405161020691906144da565b604080516001815260006020820181905291810191909152606001610206565b6101bb6103a436600461452e565b611247565b6101bb6103b7366004614699565b61185e565b61057d6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915250604080516101808101825260085463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830152700100000000000000000000000000000000810464ffffffffff1660808301527501000000000000000000000000000000000000000000810461ffff90811660a084015277010000000000000000000000000000000000000000000000820467ffffffffffffffff1660c08401527f010000000000000000000000000000000000000000000000000000000000000090910460ff1660e08301526009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166101008401527c01000000000000000000000000000000000000000000000000000000009004909216610120820152600a5480831661014083015262010000900490911661016082015290565b6040516102069190614785565b61059d6105983660046148a2565b611b29565b6040516bffffffffffffffffffffffff9091168152602001610206565b6101f9611c97565b6101bb6105d03660046149aa565b611cee565b6105dd61286a565b604051908152602001610206565b6102226129ae565b6101bb610601366004614a77565b6129d3565b6102226129e7565b610616612a78565b6000819003610651576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f61065e828483614b27565b505050565b600a5460009061069a9060649061067d9061ffff16612afb565b6106879190614ca0565b6bffffffffffffffffffffffff16612b48565b92915050565b6106a8612be7565b806bffffffffffffffffffffffff166000036106e25750336000908152600b60205260409020546bffffffffffffffffffffffff1661073c565b336000908152600b60205260409020546bffffffffffffffffffffffff8083169116101561073c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b6020526040812080548392906107699084906bffffffffffffffffffffffff16614ccb565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506107be7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526bffffffffffffffffffffffff8416602483015291909116906366316d8d90604401600060405180830381600087803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b505050505050565b600080600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614d11565b5093505092505080426109039190614d61565b600854640100000000900463ffffffff161080156109305750600854640100000000900463ffffffff1615155b1561098d57505060085477010000000000000000000000000000000000000000000000810467ffffffffffffffff16937f010000000000000000000000000000000000000000000000000000000000000090910460ff1692509050565b600082136109cf576040517f56b22ab8000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600d54604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051849273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a629190614d74565b9350935050509091565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b71612dae565b610b79612be7565b6000610b83610db9565b905060005b8151811015610d65576000600b6000848481518110610ba957610ba9614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252810191909152604001600020546bffffffffffffffffffffffff1690508015610d54576000600b6000858581518110610c0857610c08614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610c9f7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166366316d8d848481518110610ccc57610ccc614d91565b6020026020010151836040518363ffffffff1660e01b8152600401610d2192919073ffffffffffffffffffffffffffffffffffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050505b50610d5e81614dc0565b9050610b88565b5050565b610d71612a78565b6000819003610dac576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e61065e828483614b27565b60606006805480602002602001604051908101604052809291908181526020018280548015610e1e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df3575b5050505050905090565b6060600f8054610e3790614a94565b9050600003610e72576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f8054610e7f90614a94565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90614a94565b8015610e1e5780601f10610ecd57610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610edb57509395945050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f68576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526007602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610fab9083815260200190565b60405180910390a150565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461107e576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061109161108c84614e1a565b612db6565b90925090506110a66060840160408501614a77565b825173ffffffffffffffffffffffffffffffffffffffff91909116907fbf50768ccf13bd0110ca6d53a9c4f1f3271abdd4c24a56878863ed25b20598ff326110f460c0880160a08901614f07565b61110661016089016101408a01614a77565b6111108980614f24565b6111226101208c016101008d01614f89565b60208c01356111386101008e0160e08f01614fa4565b6040518061016001604052808e6000015181526020018e6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018e604001516bffffffffffffffffffffffff1681526020018e6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6080015167ffffffffffffffff1681526020018e60a0015163ffffffff1681526020018d68ffffffffffffffffff1681526020018e60e0015168ffffffffffffffffff1681526020018e610100015164ffffffffff1681526020018e610120015164ffffffffff1681526020018e610140015163ffffffff1681525060405161123899989796959493929190614fc1565b60405180910390a3505b919050565b6000806112548989613168565b915091508115611265575050611854565b604080518b3580825262ffffff6020808f0135600881901c9290921690840152909290917fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16112c28b8b8b8b8b8b6132f1565b6003546000906002906112e09060ff80821691610100900416615077565b6112ea9190615090565b6112f5906001615077565b60ff169050888114611363576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e61747572657300000000000060448201526064016109c6565b8887146113f2576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f7265706f727420727320616e64207373206d757374206265206f66206571756160448201527f6c206c656e67746800000000000000000000000000000000000000000000000060648201526084016109c6565b3360009081526004602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611435576114356150b2565b6002811115611446576114466150b2565b9052509050600281602001516002811115611463576114636150b2565b141580156114ac57506006816000015160ff168154811061148657611486614d91565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff163314155b15611513576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d6974746572000000000000000060448201526064016109c6565b5050505061151f613fca565b60008a8a6040516115319291906150e1565b604051908190038120611548918e906020016150f1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b898110156118445760006001848984602081106115b1576115b1614d91565b6115be91901a601b615077565b8e8e868181106115d0576115d0614d91565b905060200201358d8d878181106115e9576115e9614d91565b9050602002013560405160008152602001604052604051611626949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611648573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156116c8576116c86150b2565b60028111156116d9576116d96150b2565b90525092506001836020015160028111156116f6576116f66150b2565b1461175d576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e000060448201526064016109c6565b8251600090869060ff16601f811061177757611777614d91565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e617475726500000000000000000000000060448201526064016109c6565b8085846000015160ff16601f811061181357611813614d91565b73ffffffffffffffffffffffffffffffffffffffff90921660209290920201525061183d81614dc0565b9050611592565b505050611850826133a8565b5050505b5050505050505050565b611866612dae565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff167f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff90921677010000000000000000000000000000000000000000000000029190911676ffffffffffffffffffffffffffffffffffffffffffffff61ffff9384167501000000000000000000000000000000000000000000027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff64ffffffffff90961670010000000000000000000000000000000002959095167fffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff63ffffffff9788166c01000000000000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff9989166801000000000000000002999099167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9b8916640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909d169e89169e909e179b909b17999099169b909b17959095179790971695909517179690961617929092179092556101008401516101208501519093167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217600955610140830151600a8054610160860151841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a90610fab908390614785565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611bc957600080fd5b505afa158015611bdd573d6000803e3d6000fd5b5050505066038d7ea4c68000821115611c22576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2c6129e7565b90506000611c6f87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066392505050565b90506000611c7b6129ae565b9050611c8a86868486856134f7565b9998505050505050505050565b6060600e8054611ca690614a94565b9050600003611ce1576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054610e7f90614a94565b855185518560ff16601f831115611d61576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e6572730000000000000000000000000000000060448201526064016109c6565b80600003611dcb576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016109c6565b818314611e59576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109c6565b611e64816003615105565b8311611ecc576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f2068696768000000000000000060448201526064016109c6565b611ed4612a78565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611f1b9088613673565b600554156120d057600554600090611f3590600190614d61565b9050600060058281548110611f4c57611f4c614d91565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff90921693509084908110611f8657611f86614d91565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155929091168084529220805490911690556005805491925090806120065761200661511c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055600680548061206f5761206f61511c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611f1b915050565b60005b815151811015612687578151805160009190839081106120f5576120f5614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361217a576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7369676e6572206d757374206e6f7420626520656d707479000000000000000060448201526064016109c6565b600073ffffffffffffffffffffffffffffffffffffffff16826020015182815181106121a8576121a8614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361222d576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e736d6974746572206d757374206e6f7420626520656d70747900000060448201526064016109c6565b6000600460008460000151848151811061224957612249614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff166002811115612293576122936150b2565b146122fa576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e6572206164647265737300000000000000000060448201526064016109c6565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061232b5761232b614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156123cc576123cc6150b2565b0217905550600091506123dc9050565b60046000846020015184815181106123f6576123f6614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff166002811115612440576124406150b2565b146124a7576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016109c6565b6040805180820190915260ff8216815260208101600281525060046000846020015184815181106124da576124da614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561257b5761257b6150b2565b02179055505082518051600592508390811061259957612599614d91565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061261557612615614d91565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790558061267f81614dc0565b9150506120d3565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161273f9184917401000000000000000000000000000000000000000090041661514b565b92506101000a81548163ffffffff021916908363ffffffff16021790555061279e4630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a0015161368c565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0598612855988b9891977401000000000000000000000000000000000000000090920463ffffffff16969095919491939192615168565b60405180910390a15050505050505050505050565b6000806000600c8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156128da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fe9190614d11565b5093505092505080426129119190614d61565b600854640100000000900463ffffffff1610801561293e5750600854640100000000900463ffffffff1615155b1561296b5750506009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b600082136129a8576040517f43d4cf66000000000000000000000000000000000000000000000000000000008152600481018390526024016109c6565b50919050565b600a546000906129ce9060649061067d9062010000900461ffff16612afb565b905090565b6129db612a78565b6129e481613737565b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a905ccc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615209565b60005473ffffffffffffffffffffffffffffffffffffffff163314612af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c6565b565b6000806000612b08610859565b9092509050612b4082612b1c836012615077565b612b2790600a615346565b612b319087615105565b612b3b9190615355565b61382c565b949350505050565b600068ffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203760448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b5090565b600c546bffffffffffffffffffffffff16600003612c0157565b6000612c0b610db9565b80519091506000819003612c4b576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600090612c6a9083906bffffffffffffffffffffffff16614ca0565b9050806bffffffffffffffffffffffff16600003612c8757505050565b60005b82811015612d505781600b6000868481518110612ca957612ca9614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff16612d119190615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080612d4990614dc0565b9050612c8a565b50612d5b828261538e565b600c8054600090612d7b9084906bffffffffffffffffffffffff16614ccb565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b612af9612a78565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260085461010083015160009161ffff7501000000000000000000000000000000000000000000909104811691161115612e74576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e838460000151610663565b9050612e8d6129ae565b91506000612ea68560e001513a848860800151876134f7565b9050806bffffffffffffffffffffffff1685606001516bffffffffffffffffffffffff161015612f02576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600090612f38907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16426153b6565b905060003087604001518860a001518960c001516001612f5891906153c9565b8a5180516020918201206101008d015160e08e015160405161300c98979695948c918c9132910173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a015267ffffffffffffffff97881660408a0152959096166060880152608087019390935261ffff9190911660a086015263ffffffff90811660c08601526bffffffffffffffffffffffff9190911660e0850152919091166101008301529091166101208201526101400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206101608401835280845230848301526bffffffffffffffffffffffff8716848401528a83015173ffffffffffffffffffffffffffffffffffffffff16606085015260a0808c015167ffffffffffffffff1660808087019190915260e0808e015163ffffffff90811693880193909352908d015168ffffffffffffffffff90811660c08801528a169086015260085468010000000000000000810482166101008701526c010000000000000000000000009004811661012086015286166101408501529151929850909250613118918891016144da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600093845260079092529091205550929491935090915050565b600061319c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000808080806131ae888a018a6154c5565b84519499509297509095509350915060ff168015806131ce575084518114155b806131da575083518114155b806131e6575082518114155b806131f2575081518114155b15613259576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4669656c6473206d75737420626520657175616c206c656e677468000000000060448201526064016109c6565b60005b818110156132bf5761329587828151811061327957613279614d91565b6020026020010151600090815260076020526040902054151590565b6132bf576132a4600183614d61565b81036132af57600198505b6132b881614dc0565b905061325c565b50506040805160a0810182529586526020860194909452928401919091526060830152608082015290505b9250929050565b60006132fe826020615105565b613309856020615105565b613315886101446153b6565b61331f91906153b6565b61332991906153b6565b6133349060006153b6565b905036811461339f576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d61746368000000000000000060448201526064016109c6565b50505050505050565b80515160ff1660005b8181101561065e57600061345a846000015183815181106133d4576133d4614d91565b6020026020010151856020015184815181106133f2576133f2614d91565b60200260200101518660400151858151811061341057613410614d91565b60200260200101518760600151868151811061342e5761342e614d91565b60200260200101518860800151878151811061344c5761344c614d91565b6020026020010151886138ca565b90506000816006811115613470576134706150b2565b148061348d5750600181600681111561348b5761348b6150b2565b145b156134e65783518051839081106134a6576134a6614d91565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b506134f081614dc0565b90506133b1565b600854600090700100000000000000000000000000000000900464ffffffffff1685101561354057600854700100000000000000000000000000000000900464ffffffffff1694505b6008546000906127109061355a9063ffffffff1688615105565b6135649190615355565b61356e90876153b6565b60085490915060009088906135a79063ffffffff6c0100000000000000000000000082048116916801000000000000000090041661514b565b6135b1919061514b565b63ffffffff16905060006135fb6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d8e92505050565b9050600061361c8261360d8587615105565b61361791906153b6565b613ed0565b905060008668ffffffffffffffffff168868ffffffffffffffffff168a68ffffffffffffffffff1661364e9190615369565b6136589190615369565b90506136648183615369565b9b9a5050505050505050505050565b600061367d610db9565b511115610d6557610d65612be7565b6000808a8a8a8a8a8a8a8a8a6040516020016136b099989796959493929190615597565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036137b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006bffffffffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f362062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b600080848060200190518101906138e19190615663565b905060003a8261012001518361010001516138fc919061572b565b64ffffffffff1661390d9190615105565b905060008460ff166139556000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d8e92505050565b61395f9190615355565b9050600061397061361783856153b6565b9050600061397d3a613ed0565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663330605298e8e868b60c0015168ffffffffffffffffff168c60e0015168ffffffffffffffffff168a6139ec9190615369565b6139f69190615369565b336040518061016001604052808f6000015181526020018f6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018f604001516bffffffffffffffffffffffff1681526020018f6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018f6080015167ffffffffffffffff1681526020018f60a0015163ffffffff168152602001600068ffffffffffffffffff1681526020018f60e0015168ffffffffffffffffff1681526020018f610100015164ffffffffff1681526020018f610120015164ffffffffff1681526020018f610140015163ffffffff168152506040518763ffffffff1660e01b8152600401613b0496959493929190615749565b60408051808303816000875af1158015613b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4691906157c5565b90925090506000826006811115613b5f57613b5f6150b2565b1480613b7c57506001826006811115613b7a57613b7a6150b2565b145b15613d7d5760008e815260076020526040812055613b9a8185615369565b336000908152600b602052604081208054909190613bc79084906bffffffffffffffffffffffff16615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660e0015168ffffffffffffffffff16600c60008282829054906101000a90046bffffffffffffffffffffffff16613c2d9190615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660c0015168ffffffffffffffffff16600b6000613c77613eef565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190613cbd9084906bffffffffffffffffffffffff16615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508d7f08a4a0761e3c98d288cb4af9342660f49550d83139fb3b762b70d34bed6273688487848b60e0015160008d60c00151604051613d74969594939291906bffffffffffffffffffffffff9687168152602081019590955292909416604084015268ffffffffffffffffff9081166060840152928316608083015290911660a082015260c00190565b60405180910390a25b509c9b505050505050505050505050565b600046613d9a81613f60565b15613e1657606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0f91906157f8565b9392505050565b613e1f81613f83565b15613ec75773420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff166349948e0e8460405180608001604052806048815260200161585e60489139604051602001613e7f929190615811565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613eaa91906140db565b602060405180830381865afa158015613deb573d6000803e3d6000fd5b50600092915050565b600061069a613edd61286a565b612b3184670de0b6b3a7640000615105565b60003073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615840565b600061a4b1821480613f74575062066eed82145b8061069a57505062066eee1490565b6000600a821480613f9557506101a482145b80613fa2575062aa37dc82145b80613fae575061210582145b80613fbb575062014a3382145b8061069a57505062014a341490565b604051806103e00160405280601f906020820280368337509192915050565b60008083601f840112613ffb57600080fd5b50813567ffffffffffffffff81111561401357600080fd5b6020830191508360208285010111156132ea57600080fd5b6000806020838503121561403e57600080fd5b823567ffffffffffffffff81111561405557600080fd5b61406185828601613fe9565b90969095509350505050565b60005b83811015614088578181015183820152602001614070565b50506000910152565b600081518084526140a981602086016020860161406d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e0f6020830184614091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715614141576141416140ee565b60405290565b604051610160810167ffffffffffffffff81118282101715614141576141416140ee565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156141b2576141b26140ee565b604052919050565b600082601f8301126141cb57600080fd5b813567ffffffffffffffff8111156141e5576141e56140ee565b61421660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161416b565b81815284602083860101111561422b57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561425a57600080fd5b813567ffffffffffffffff81111561427157600080fd5b612b40848285016141ba565b73ffffffffffffffffffffffffffffffffffffffff811681146129e457600080fd5b80356112428161427d565b6bffffffffffffffffffffffff811681146129e457600080fd5b8035611242816142aa565b600080604083850312156142e257600080fd5b82356142ed8161427d565b915060208301356142fd816142aa565b809150509250929050565b600081518084526020808501945080840160005b8381101561434e57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161431c565b509495945050505050565b602081526000613e0f6020830184614308565b60006020828403121561437e57600080fd5b5035919050565b60006020828403121561439757600080fd5b813567ffffffffffffffff8111156143ae57600080fd5b82016101608185031215613e0f57600080fd5b8051825260208101516143ec602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604081015161440c60408401826bffffffffffffffffffffffff169052565b506060810151614434606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080810151614450608084018267ffffffffffffffff169052565b5060a081015161446860a084018263ffffffff169052565b5060c081015161448560c084018268ffffffffffffffffff169052565b5060e08101516144a260e084018268ffffffffffffffffff169052565b506101008181015164ffffffffff9081169184019190915261012080830151909116908301526101409081015163ffffffff16910152565b610160810161069a82846143c1565b60008083601f8401126144fb57600080fd5b50813567ffffffffffffffff81111561451357600080fd5b6020830191508360208260051b85010111156132ea57600080fd5b60008060008060008060008060e0898b03121561454a57600080fd5b606089018a81111561455b57600080fd5b8998503567ffffffffffffffff8082111561457557600080fd5b6145818c838d01613fe9565b909950975060808b013591508082111561459a57600080fd5b6145a68c838d016144e9565b909750955060a08b01359150808211156145bf57600080fd5b506145cc8b828c016144e9565b999c989b50969995989497949560c00135949350505050565b63ffffffff811681146129e457600080fd5b8035611242816145e5565b64ffffffffff811681146129e457600080fd5b803561124281614602565b803561ffff8116811461124257600080fd5b67ffffffffffffffff811681146129e457600080fd5b803561124281614632565b60ff811681146129e457600080fd5b803561124281614653565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461124257600080fd5b600061018082840312156146ac57600080fd5b6146b461411d565b6146bd836145f7565b81526146cb602084016145f7565b60208201526146dc604084016145f7565b60408201526146ed606084016145f7565b60608201526146fe60808401614615565b608082015261470f60a08401614620565b60a082015261472060c08401614648565b60c082015261473160e08401614662565b60e082015261010061474481850161466d565b908201526101206147568482016145f7565b90820152610140614768848201614620565b9082015261016061477a848201614620565b908201529392505050565b815163ffffffff168152610180810160208301516147ab602084018263ffffffff169052565b5060408301516147c3604084018263ffffffff169052565b5060608301516147db606084018263ffffffff169052565b5060808301516147f4608084018264ffffffffff169052565b5060a083015161480a60a084018261ffff169052565b5060c083015161482660c084018267ffffffffffffffff169052565b5060e083015161483b60e084018260ff169052565b50610100838101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101608085015191821681850152905b505092915050565b6000806000806000608086880312156148ba57600080fd5b85356148c581614632565b9450602086013567ffffffffffffffff8111156148e157600080fd5b6148ed88828901613fe9565b9095509350506040860135614901816145e5565b949793965091946060013592915050565b600067ffffffffffffffff82111561492c5761492c6140ee565b5060051b60200190565b600082601f83011261494757600080fd5b8135602061495c61495783614912565b61416b565b82815260059290921b8401810191818101908684111561497b57600080fd5b8286015b8481101561499f5780356149928161427d565b835291830191830161497f565b509695505050505050565b60008060008060008060c087890312156149c357600080fd5b863567ffffffffffffffff808211156149db57600080fd5b6149e78a838b01614936565b975060208901359150808211156149fd57600080fd5b614a098a838b01614936565b9650614a1760408a01614662565b95506060890135915080821115614a2d57600080fd5b614a398a838b016141ba565b9450614a4760808a01614648565b935060a0890135915080821115614a5d57600080fd5b50614a6a89828a016141ba565b9150509295509295509295565b600060208284031215614a8957600080fd5b8135613e0f8161427d565b600181811c90821680614aa857607f821691505b6020821081036129a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561065e57600081815260208120601f850160051c81016020861015614b085750805b601f850160051c820191505b8181101561085157828155600101614b14565b67ffffffffffffffff831115614b3f57614b3f6140ee565b614b5383614b4d8354614a94565b83614ae1565b6000601f841160018114614ba55760008515614b6f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614c3b565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614bf45786850135825560209485019460019092019101614bd4565b5086821015614c2f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006bffffffffffffffffffffffff80841680614cbf57614cbf614c42565b92169190910492915050565b6bffffffffffffffffffffffff828116828216039080821115614cf057614cf0614c71565b5092915050565b805169ffffffffffffffffffff8116811461124257600080fd5b600080600080600060a08688031215614d2957600080fd5b614d3286614cf7565b9450602086015193506040860151925060608601519150614d5560808701614cf7565b90509295509295909350565b8181038181111561069a5761069a614c71565b600060208284031215614d8657600080fd5b8151613e0f81614653565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614df157614df1614c71565b5060010190565b68ffffffffffffffffff811681146129e457600080fd5b803561124281614df8565b60006101608236031215614e2d57600080fd5b614e35614147565b823567ffffffffffffffff811115614e4c57600080fd5b614e58368286016141ba565b82525060208301356020820152614e716040840161429f565b6040820152614e82606084016142c4565b6060820152614e9360808401614e0f565b6080820152614ea460a08401614648565b60a0820152614eb560c08401614648565b60c0820152614ec660e084016145f7565b60e0820152610100614ed9818501614620565b90820152610120614eeb848201614648565b90820152610140614efd84820161429f565b9082015292915050565b600060208284031215614f1957600080fd5b8135613e0f81614632565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f5957600080fd5b83018035915067ffffffffffffffff821115614f7457600080fd5b6020019150368190038213156132ea57600080fd5b600060208284031215614f9b57600080fd5b613e0f82614620565b600060208284031215614fb657600080fd5b8135613e0f816145e5565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a166020830152881660408201526102406060820181905281018690526000610260878982850137600083890182015261ffff8716608084015260a0830186905263ffffffff851660c0840152601f88017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016830101905061506960e08301846143c1565b9a9950505050505050505050565b60ff818116838216019081111561069a5761069a614c71565b600060ff8316806150a3576150a3614c42565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b808202811582820484141761069a5761069a614c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff818116838216019080821115614cf057614cf0614c71565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526151988184018a614308565b905082810360808401526151ac8189614308565b905060ff871660a084015282810360c08401526151c98187614091565b905067ffffffffffffffff851660e08401528281036101008401526151ee8185614091565b9c9b505050505050505050505050565b805161124281614df8565b60006020828403121561521b57600080fd5b8151613e0f81614df8565b600181815b8085111561527f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561526557615265614c71565b8085161561527257918102915b93841c939080029061522b565b509250929050565b6000826152965750600161069a565b816152a35750600061069a565b81600181146152b957600281146152c3576152df565b600191505061069a565b60ff8411156152d4576152d4614c71565b50506001821b61069a565b5060208310610133831016604e8410600b8410161715615302575081810a61069a565b61530c8383615226565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561533e5761533e614c71565b029392505050565b6000613e0f60ff841683615287565b60008261536457615364614c42565b500490565b6bffffffffffffffffffffffff818116838216019080821115614cf057614cf0614c71565b6bffffffffffffffffffffffff81811683821602808216919082811461489a5761489a614c71565b8082018082111561069a5761069a614c71565b67ffffffffffffffff818116838216019080821115614cf057614cf0614c71565b600082601f8301126153fb57600080fd5b8135602061540b61495783614912565b82815260059290921b8401810191818101908684111561542a57600080fd5b8286015b8481101561499f578035835291830191830161542e565b600082601f83011261545657600080fd5b8135602061546661495783614912565b82815260059290921b8401810191818101908684111561548557600080fd5b8286015b8481101561499f57803567ffffffffffffffff8111156154a95760008081fd5b6154b78986838b01016141ba565b845250918301918301615489565b600080600080600060a086880312156154dd57600080fd5b853567ffffffffffffffff808211156154f557600080fd5b61550189838a016153ea565b9650602088013591508082111561551757600080fd5b61552389838a01615445565b9550604088013591508082111561553957600080fd5b61554589838a01615445565b9450606088013591508082111561555b57600080fd5b61556789838a01615445565b9350608088013591508082111561557d57600080fd5b5061558a88828901615445565b9150509295509295909350565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526155de8285018b614308565b915083820360808501526155f2828a614308565b915060ff881660a085015283820360c085015261560f8288614091565b90861660e085015283810361010085015290506151ee8185614091565b80516112428161427d565b8051611242816142aa565b805161124281614632565b8051611242816145e5565b805161124281614602565b6000610160828403121561567657600080fd5b61567e614147565b8251815261568e6020840161562c565b602082015261569f60408401615637565b60408201526156b06060840161562c565b60608201526156c160808401615642565b60808201526156d260a0840161564d565b60a08201526156e360c084016151fe565b60c08201526156f460e084016151fe565b60e0820152610100615707818501615658565b90820152610120615719848201615658565b9082015261014061477a84820161564d565b64ffffffffff818116838216019080821115614cf057614cf0614c71565b600061020080835261575d8184018a614091565b905082810360208401526157718189614091565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff8616608085015291506157ba905060a08301846143c1565b979650505050505050565b600080604083850312156157d857600080fd5b8251600781106157e757600080fd5b60208401519092506142fd816142aa565b60006020828403121561580a57600080fd5b5051919050565b6000835161582381846020880161406d565b83519083019061583781836020880161406d565b01949350505050565b60006020828403121561585257600080fd5b8151613e0f8161427d56fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a", + Bin: "0x60a06040523480156200001157600080fd5b506040516200601f3803806200601f8339810160408190526200003491620004db565b83838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200014e565b5050506001600160a01b038116620000ee57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03908116608052600c80546001600160601b03166c0100000000000000000000000085841602179055600d80546001600160a01b0319169183169190911790556200014083620001f9565b505050505050505062000742565b336001600160a01b03821603620001a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620002036200039e565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff16600160f81b026001600160f81b036001600160401b03909216600160b81b02919091166001600160b81b0361ffff938416600160a81b0261ffff60a81b1964ffffffffff909616600160801b029590951666ffffffffffffff60801b1963ffffffff9788166c010000000000000000000000000263ffffffff60601b19998916680100000000000000000299909916600160401b600160801b03199b8916640100000000026001600160401b0319909d169e89169e909e179b909b17999099169b909b1795909517979097169590951717969096161792909217909255610100840151610120850151909316600160e01b026001600160e01b0390931692909217600955610140830151600a80546101608601518416620100000263ffffffff19919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a906200039390839062000639565b60405180910390a150565b620003a8620003aa565b565b6000546001600160a01b03163314620003a85760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000087565b80516001600160a01b03811681146200041e57600080fd5b919050565b60405161018081016001600160401b03811182821017156200045557634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff811681146200041e57600080fd5b805164ffffffffff811681146200041e57600080fd5b805161ffff811681146200041e57600080fd5b80516001600160401b03811681146200041e57600080fd5b805160ff811681146200041e57600080fd5b80516001600160e01b03811681146200041e57600080fd5b6000806000808486036101e0811215620004f457600080fd5b620004ff8662000406565b945061018080601f19830112156200051657600080fd5b6200052062000423565b915062000530602088016200045b565b825262000540604088016200045b565b602083015262000553606088016200045b565b604083015262000566608088016200045b565b60608301526200057960a0880162000470565b60808301526200058c60c0880162000486565b60a08301526200059f60e0880162000499565b60c0830152610100620005b4818901620004b1565b60e0840152610120620005c9818a01620004c3565b828501526101409150620005df828a016200045b565b90840152610160620005f389820162000486565b8285015262000604838a0162000486565b90840152509093506200061d90506101a0860162000406565b91506200062e6101c0860162000406565b905092959194509250565b815163ffffffff1681526101808101602083015162000660602084018263ffffffff169052565b50604083015162000679604084018263ffffffff169052565b50606083015162000692606084018263ffffffff169052565b506080830151620006ac608084018264ffffffffff169052565b5060a0830151620006c360a084018261ffff169052565b5060c0830151620006df60c08401826001600160401b03169052565b5060e0830151620006f560e084018260ff169052565b50610100838101516001600160e01b0316908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101609384015116929091019190915290565b608051615897620007886000396000818161079c01528181610c7d01528181610f110152818161102701528181611b2d015281816129eb015261396901526158976000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638da5cb5b116100ee578063d227d24511610097578063e4ddcea611610071578063e4ddcea6146105d5578063f2f22ef1146105eb578063f2fde38b146105f3578063f6ea41f61461060657600080fd5b8063d227d2451461058a578063d328a91e146105ba578063e3d0e712146105c257600080fd5b8063b1dc65a4116100c8578063b1dc65a414610396578063ba9c924d146103a9578063c3f909d4146103bc57600080fd5b80638da5cb5b1461032e578063a631571e14610356578063afcb95d71461037657600080fd5b80637d4807871161015057806381f1b9381161012a57806381f1b938146102a657806381ff7048146102ae57806385b214cf1461031b57600080fd5b80637d480787146102765780637f15e1661461027e578063814118341461029157600080fd5b806366316d8d1161018157806366316d8d1461023c5780637212762f1461024f57806379ba50971461026e57600080fd5b8063083a5466146101a8578063181f5a77146101bd578063626f458c1461020f575b600080fd5b6101bb6101b6366004614010565b61060e565b005b6101f96040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e332e300000000081525081565b60405161020691906140c0565b60405180910390f35b61022261021d36600461422d565b610663565b60405168ffffffffffffffffff9091168152602001610206565b6101bb61024a3660046142b4565b6106a0565b610257610859565b6040805192835260ff909116602083015201610206565b6101bb610a6c565b6101bb610b69565b6101bb61028c366004614010565b610d69565b610299610db9565b604051610206919061433e565b6101f9610e28565b6102f860015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610206565b6101bb610329366004614351565b610ef9565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b61036961036436600461436a565b610fb6565b60405161020691906144bf565b604080516001815260006020820181905291810191909152606001610206565b6101bb6103a4366004614513565b611247565b6101bb6103b736600461467e565b61185e565b61057d6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915250604080516101808101825260085463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830152700100000000000000000000000000000000810464ffffffffff1660808301527501000000000000000000000000000000000000000000810461ffff90811660a084015277010000000000000000000000000000000000000000000000820467ffffffffffffffff1660c08401527f010000000000000000000000000000000000000000000000000000000000000090910460ff1660e08301526009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166101008401527c01000000000000000000000000000000000000000000000000000000009004909216610120820152600a5480831661014083015262010000900490911661016082015290565b604051610206919061476a565b61059d610598366004614887565b611b29565b6040516bffffffffffffffffffffffff9091168152602001610206565b6101f9611c97565b6101bb6105d036600461498f565b611cee565b6105dd61286a565b604051908152602001610206565b6102226129ae565b6101bb610601366004614a5c565b6129d3565b6102226129e7565b610616612a78565b6000819003610651576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f61065e828483614b0c565b505050565b600a5460009061069a9060649061067d9061ffff16612afb565b6106879190614c85565b6bffffffffffffffffffffffff16612b48565b92915050565b6106a8612be7565b806bffffffffffffffffffffffff166000036106e25750336000908152600b60205260409020546bffffffffffffffffffffffff1661073c565b336000908152600b60205260409020546bffffffffffffffffffffffff8083169116101561073c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b6020526040812080548392906107699084906bffffffffffffffffffffffff16614cb0565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506107be7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526bffffffffffffffffffffffff8416602483015291909116906366316d8d90604401600060405180830381600087803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b505050505050565b600080600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614cf6565b5093505092505080426109039190614d46565b600854640100000000900463ffffffff161080156109305750600854640100000000900463ffffffff1615155b1561098d57505060085477010000000000000000000000000000000000000000000000810467ffffffffffffffff16937f010000000000000000000000000000000000000000000000000000000000000090910460ff1692509050565b600082136109cf576040517f56b22ab8000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600d54604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051849273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a629190614d59565b9350935050509091565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b71612d93565b610b79612be7565b6000610b83610db9565b905060005b8151811015610d65576000600b6000848481518110610ba957610ba9614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252810191909152604001600020546bffffffffffffffffffffffff1690508015610d54576000600b6000858581518110610c0857610c08614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610c9f7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166366316d8d848481518110610ccc57610ccc614d76565b6020026020010151836040518363ffffffff1660e01b8152600401610d2192919073ffffffffffffffffffffffffffffffffffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050505b50610d5e81614da5565b9050610b88565b5050565b610d71612a78565b6000819003610dac576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e61065e828483614b0c565b60606006805480602002602001604051908101604052809291908181526020018280548015610e1e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df3575b5050505050905090565b6060600f8054610e3790614a79565b9050600003610e72576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f8054610e7f90614a79565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90614a79565b8015610e1e5780601f10610ecd57610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610edb57509395945050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f68576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526007602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610fab9083815260200190565b60405180910390a150565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461107e576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061109161108c84614dff565b612d9b565b90925090506110a66060840160408501614a5c565b825173ffffffffffffffffffffffffffffffffffffffff91909116907fbf50768ccf13bd0110ca6d53a9c4f1f3271abdd4c24a56878863ed25b20598ff326110f460c0880160a08901614eec565b61110661016089016101408a01614a5c565b6111108980614f09565b6111226101208c016101008d01614f6e565b60208c01356111386101008e0160e08f01614f89565b6040518061016001604052808e6000015181526020018e6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018e604001516bffffffffffffffffffffffff1681526020018e6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6080015167ffffffffffffffff1681526020018e60a0015163ffffffff1681526020018d68ffffffffffffffffff1681526020018e60e0015168ffffffffffffffffff1681526020018e610100015164ffffffffff1681526020018e610120015164ffffffffff1681526020018e610140015163ffffffff1681525060405161123899989796959493929190614fa6565b60405180910390a3505b919050565b600080611254898961314d565b915091508115611265575050611854565b604080518b3580825262ffffff6020808f0135600881901c9290921690840152909290917fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16112c28b8b8b8b8b8b6132d6565b6003546000906002906112e09060ff8082169161010090041661505c565b6112ea9190615075565b6112f590600161505c565b60ff169050888114611363576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e61747572657300000000000060448201526064016109c6565b8887146113f2576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f7265706f727420727320616e64207373206d757374206265206f66206571756160448201527f6c206c656e67746800000000000000000000000000000000000000000000000060648201526084016109c6565b3360009081526004602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561143557611435615097565b600281111561144657611446615097565b905250905060028160200151600281111561146357611463615097565b141580156114ac57506006816000015160ff168154811061148657611486614d76565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff163314155b15611513576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d6974746572000000000000000060448201526064016109c6565b5050505061151f613faf565b60008a8a6040516115319291906150c6565b604051908190038120611548918e906020016150d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b898110156118445760006001848984602081106115b1576115b1614d76565b6115be91901a601b61505c565b8e8e868181106115d0576115d0614d76565b905060200201358d8d878181106115e9576115e9614d76565b9050602002013560405160008152602001604052604051611626949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611648573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156116c8576116c8615097565b60028111156116d9576116d9615097565b90525092506001836020015160028111156116f6576116f6615097565b1461175d576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e000060448201526064016109c6565b8251600090869060ff16601f811061177757611777614d76565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e617475726500000000000000000000000060448201526064016109c6565b8085846000015160ff16601f811061181357611813614d76565b73ffffffffffffffffffffffffffffffffffffffff90921660209290920201525061183d81614da5565b9050611592565b5050506118508261338d565b5050505b5050505050505050565b611866612d93565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff167f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff90921677010000000000000000000000000000000000000000000000029190911676ffffffffffffffffffffffffffffffffffffffffffffff61ffff9384167501000000000000000000000000000000000000000000027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff64ffffffffff90961670010000000000000000000000000000000002959095167fffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff63ffffffff9788166c01000000000000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff9989166801000000000000000002999099167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9b8916640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909d169e89169e909e179b909b17999099169b909b17959095179790971695909517179690961617929092179092556101008401516101208501519093167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217600955610140830151600a8054610160860151841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a90610fab90839061476a565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611bc957600080fd5b505afa158015611bdd573d6000803e3d6000fd5b5050505066038d7ea4c68000821115611c22576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2c6129e7565b90506000611c6f87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066392505050565b90506000611c7b6129ae565b9050611c8a86868486856134dc565b9998505050505050505050565b6060600e8054611ca690614a79565b9050600003611ce1576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054610e7f90614a79565b855185518560ff16601f831115611d61576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e6572730000000000000000000000000000000060448201526064016109c6565b80600003611dcb576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016109c6565b818314611e59576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109c6565b611e648160036150ea565b8311611ecc576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f2068696768000000000000000060448201526064016109c6565b611ed4612a78565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611f1b9088613658565b600554156120d057600554600090611f3590600190614d46565b9050600060058281548110611f4c57611f4c614d76565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff90921693509084908110611f8657611f86614d76565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559290911680845292208054909116905560058054919250908061200657612006615101565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055600680548061206f5761206f615101565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611f1b915050565b60005b815151811015612687578151805160009190839081106120f5576120f5614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361217a576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7369676e6572206d757374206e6f7420626520656d707479000000000000000060448201526064016109c6565b600073ffffffffffffffffffffffffffffffffffffffff16826020015182815181106121a8576121a8614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361222d576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e736d6974746572206d757374206e6f7420626520656d70747900000060448201526064016109c6565b6000600460008460000151848151811061224957612249614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561229357612293615097565b146122fa576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e6572206164647265737300000000000000000060448201526064016109c6565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061232b5761232b614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156123cc576123cc615097565b0217905550600091506123dc9050565b60046000846020015184815181106123f6576123f6614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561244057612440615097565b146124a7576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016109c6565b6040805180820190915260ff8216815260208101600281525060046000846020015184815181106124da576124da614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561257b5761257b615097565b02179055505082518051600592508390811061259957612599614d76565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061261557612615614d76565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790558061267f81614da5565b9150506120d3565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161273f91849174010000000000000000000000000000000000000000900416615130565b92506101000a81548163ffffffff021916908363ffffffff16021790555061279e4630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a00151613671565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0598612855988b9891977401000000000000000000000000000000000000000090920463ffffffff1696909591949193919261514d565b60405180910390a15050505050505050505050565b6000806000600c8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156128da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fe9190614cf6565b5093505092505080426129119190614d46565b600854640100000000900463ffffffff1610801561293e5750600854640100000000900463ffffffff1615155b1561296b5750506009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b600082136129a8576040517f43d4cf66000000000000000000000000000000000000000000000000000000008152600481018390526024016109c6565b50919050565b600a546000906129ce9060649061067d9062010000900461ffff16612afb565b905090565b6129db612a78565b6129e48161371c565b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a905ccc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce91906151ee565b60005473ffffffffffffffffffffffffffffffffffffffff163314612af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c6565b565b6000806000612b08610859565b9092509050612b4082612b1c83601261505c565b612b2790600a61532b565b612b3190876150ea565b612b3b919061533a565b613811565b949350505050565b600068ffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203760448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b5090565b600c546bffffffffffffffffffffffff16600003612c0157565b6000612c0b610db9565b80519091506000819003612c4b576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600090612c6a9083906bffffffffffffffffffffffff16614c85565b905060005b82811015612d355781600b6000868481518110612c8e57612c8e614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff16612cf6919061534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080612d2e90614da5565b9050612c6f565b50612d408282615373565b600c8054600090612d609084906bffffffffffffffffffffffff16614cb0565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b612af9612a78565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260085461010083015160009161ffff7501000000000000000000000000000000000000000000909104811691161115612e59576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e688460000151610663565b9050612e726129ae565b91506000612e8b8560e001513a848860800151876134dc565b9050806bffffffffffffffffffffffff1685606001516bffffffffffffffffffffffff161015612ee7576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600090612f1d907c0100000000000000000000000000000000000000000000000000000000900463ffffffff164261539b565b905060003087604001518860a001518960c001516001612f3d91906153ae565b8a5180516020918201206101008d015160e08e0151604051612ff198979695948c918c9132910173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a015267ffffffffffffffff97881660408a0152959096166060880152608087019390935261ffff9190911660a086015263ffffffff90811660c08601526bffffffffffffffffffffffff9190911660e0850152919091166101008301529091166101208201526101400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206101608401835280845230848301526bffffffffffffffffffffffff8716848401528a83015173ffffffffffffffffffffffffffffffffffffffff16606085015260a0808c015167ffffffffffffffff1660808087019190915260e0808e015163ffffffff90811693880193909352908d015168ffffffffffffffffff90811660c08801528a169086015260085468010000000000000000810482166101008701526c0100000000000000000000000090048116610120860152861661014085015291519298509092506130fd918891016144bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600093845260079092529091205550929491935090915050565b60006131816040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b600080808080613193888a018a6154aa565b84519499509297509095509350915060ff168015806131b3575084518114155b806131bf575083518114155b806131cb575082518114155b806131d7575081518114155b1561323e576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4669656c6473206d75737420626520657175616c206c656e677468000000000060448201526064016109c6565b60005b818110156132a45761327a87828151811061325e5761325e614d76565b6020026020010151600090815260076020526040902054151590565b6132a457613289600183614d46565b810361329457600198505b61329d81614da5565b9050613241565b50506040805160a0810182529586526020860194909452928401919091526060830152608082015290505b9250929050565b60006132e38260206150ea565b6132ee8560206150ea565b6132fa8861014461539b565b613304919061539b565b61330e919061539b565b61331990600061539b565b9050368114613384576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d61746368000000000000000060448201526064016109c6565b50505050505050565b80515160ff1660005b8181101561065e57600061343f846000015183815181106133b9576133b9614d76565b6020026020010151856020015184815181106133d7576133d7614d76565b6020026020010151866040015185815181106133f5576133f5614d76565b60200260200101518760600151868151811061341357613413614d76565b60200260200101518860800151878151811061343157613431614d76565b6020026020010151886138af565b9050600081600681111561345557613455615097565b14806134725750600181600681111561347057613470615097565b145b156134cb57835180518390811061348b5761348b614d76565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b506134d581614da5565b9050613396565b600854600090700100000000000000000000000000000000900464ffffffffff1685101561352557600854700100000000000000000000000000000000900464ffffffffff1694505b6008546000906127109061353f9063ffffffff16886150ea565b613549919061533a565b613553908761539b565b600854909150600090889061358c9063ffffffff6c01000000000000000000000000820481169168010000000000000000900416615130565b6135969190615130565b63ffffffff16905060006135e06000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d7392505050565b90506000613601826135f285876150ea565b6135fc919061539b565b613eb5565b905060008668ffffffffffffffffff168868ffffffffffffffffff168a68ffffffffffffffffff16613633919061534e565b61363d919061534e565b9050613649818361534e565b9b9a5050505050505050505050565b6000613662610db9565b511115610d6557610d65612be7565b6000808a8a8a8a8a8a8a8a8a6040516020016136959998979695949392919061557c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361379b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006bffffffffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f362062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b600080848060200190518101906138c69190615648565b905060003a8261012001518361010001516138e19190615710565b64ffffffffff166138f291906150ea565b905060008460ff1661393a6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d7392505050565b613944919061533a565b905060006139556135fc838561539b565b905060006139623a613eb5565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663330605298e8e868b60c0015168ffffffffffffffffff168c60e0015168ffffffffffffffffff168a6139d1919061534e565b6139db919061534e565b336040518061016001604052808f6000015181526020018f6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018f604001516bffffffffffffffffffffffff1681526020018f6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018f6080015167ffffffffffffffff1681526020018f60a0015163ffffffff168152602001600068ffffffffffffffffff1681526020018f60e0015168ffffffffffffffffff1681526020018f610100015164ffffffffff1681526020018f610120015164ffffffffff1681526020018f610140015163ffffffff168152506040518763ffffffff1660e01b8152600401613ae99695949392919061572e565b60408051808303816000875af1158015613b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2b91906157aa565b90925090506000826006811115613b4457613b44615097565b1480613b6157506001826006811115613b5f57613b5f615097565b145b15613d625760008e815260076020526040812055613b7f818561534e565b336000908152600b602052604081208054909190613bac9084906bffffffffffffffffffffffff1661534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660e0015168ffffffffffffffffff16600c60008282829054906101000a90046bffffffffffffffffffffffff16613c12919061534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660c0015168ffffffffffffffffff16600b6000613c5c613ed4565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190613ca29084906bffffffffffffffffffffffff1661534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508d7f08a4a0761e3c98d288cb4af9342660f49550d83139fb3b762b70d34bed6273688487848b60e0015160008d60c00151604051613d59969594939291906bffffffffffffffffffffffff9687168152602081019590955292909416604084015268ffffffffffffffffff9081166060840152928316608083015290911660a082015260c00190565b60405180910390a25b509c9b505050505050505050505050565b600046613d7f81613f45565b15613dfb57606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613df491906157dd565b9392505050565b613e0481613f68565b15613eac5773420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff166349948e0e8460405180608001604052806048815260200161584360489139604051602001613e649291906157f6565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613e8f91906140c0565b602060405180830381865afa158015613dd0573d6000803e3d6000fd5b50600092915050565b600061069a613ec261286a565b612b3184670de0b6b3a76400006150ea565b60003073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f21573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615825565b600061a4b1821480613f59575062066eed82145b8061069a57505062066eee1490565b6000600a821480613f7a57506101a482145b80613f87575062aa37dc82145b80613f93575061210582145b80613fa0575062014a3382145b8061069a57505062014a341490565b604051806103e00160405280601f906020820280368337509192915050565b60008083601f840112613fe057600080fd5b50813567ffffffffffffffff811115613ff857600080fd5b6020830191508360208285010111156132cf57600080fd5b6000806020838503121561402357600080fd5b823567ffffffffffffffff81111561403a57600080fd5b61404685828601613fce565b90969095509350505050565b60005b8381101561406d578181015183820152602001614055565b50506000910152565b6000815180845261408e816020860160208601614052565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613df46020830184614076565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715614126576141266140d3565b60405290565b604051610160810167ffffffffffffffff81118282101715614126576141266140d3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614197576141976140d3565b604052919050565b600082601f8301126141b057600080fd5b813567ffffffffffffffff8111156141ca576141ca6140d3565b6141fb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614150565b81815284602083860101111561421057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561423f57600080fd5b813567ffffffffffffffff81111561425657600080fd5b612b408482850161419f565b73ffffffffffffffffffffffffffffffffffffffff811681146129e457600080fd5b803561124281614262565b6bffffffffffffffffffffffff811681146129e457600080fd5b80356112428161428f565b600080604083850312156142c757600080fd5b82356142d281614262565b915060208301356142e28161428f565b809150509250929050565b600081518084526020808501945080840160005b8381101561433357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614301565b509495945050505050565b602081526000613df460208301846142ed565b60006020828403121561436357600080fd5b5035919050565b60006020828403121561437c57600080fd5b813567ffffffffffffffff81111561439357600080fd5b82016101608185031215613df457600080fd5b8051825260208101516143d1602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408101516143f160408401826bffffffffffffffffffffffff169052565b506060810151614419606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080810151614435608084018267ffffffffffffffff169052565b5060a081015161444d60a084018263ffffffff169052565b5060c081015161446a60c084018268ffffffffffffffffff169052565b5060e081015161448760e084018268ffffffffffffffffff169052565b506101008181015164ffffffffff9081169184019190915261012080830151909116908301526101409081015163ffffffff16910152565b610160810161069a82846143a6565b60008083601f8401126144e057600080fd5b50813567ffffffffffffffff8111156144f857600080fd5b6020830191508360208260051b85010111156132cf57600080fd5b60008060008060008060008060e0898b03121561452f57600080fd5b606089018a81111561454057600080fd5b8998503567ffffffffffffffff8082111561455a57600080fd5b6145668c838d01613fce565b909950975060808b013591508082111561457f57600080fd5b61458b8c838d016144ce565b909750955060a08b01359150808211156145a457600080fd5b506145b18b828c016144ce565b999c989b50969995989497949560c00135949350505050565b63ffffffff811681146129e457600080fd5b8035611242816145ca565b64ffffffffff811681146129e457600080fd5b8035611242816145e7565b803561ffff8116811461124257600080fd5b67ffffffffffffffff811681146129e457600080fd5b803561124281614617565b60ff811681146129e457600080fd5b803561124281614638565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461124257600080fd5b6000610180828403121561469157600080fd5b614699614102565b6146a2836145dc565b81526146b0602084016145dc565b60208201526146c1604084016145dc565b60408201526146d2606084016145dc565b60608201526146e3608084016145fa565b60808201526146f460a08401614605565b60a082015261470560c0840161462d565b60c082015261471660e08401614647565b60e0820152610100614729818501614652565b9082015261012061473b8482016145dc565b9082015261014061474d848201614605565b9082015261016061475f848201614605565b908201529392505050565b815163ffffffff16815261018081016020830151614790602084018263ffffffff169052565b5060408301516147a8604084018263ffffffff169052565b5060608301516147c0606084018263ffffffff169052565b5060808301516147d9608084018264ffffffffff169052565b5060a08301516147ef60a084018261ffff169052565b5060c083015161480b60c084018267ffffffffffffffff169052565b5060e083015161482060e084018260ff169052565b50610100838101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101608085015191821681850152905b505092915050565b60008060008060006080868803121561489f57600080fd5b85356148aa81614617565b9450602086013567ffffffffffffffff8111156148c657600080fd5b6148d288828901613fce565b90955093505060408601356148e6816145ca565b949793965091946060013592915050565b600067ffffffffffffffff821115614911576149116140d3565b5060051b60200190565b600082601f83011261492c57600080fd5b8135602061494161493c836148f7565b614150565b82815260059290921b8401810191818101908684111561496057600080fd5b8286015b8481101561498457803561497781614262565b8352918301918301614964565b509695505050505050565b60008060008060008060c087890312156149a857600080fd5b863567ffffffffffffffff808211156149c057600080fd5b6149cc8a838b0161491b565b975060208901359150808211156149e257600080fd5b6149ee8a838b0161491b565b96506149fc60408a01614647565b95506060890135915080821115614a1257600080fd5b614a1e8a838b0161419f565b9450614a2c60808a0161462d565b935060a0890135915080821115614a4257600080fd5b50614a4f89828a0161419f565b9150509295509295509295565b600060208284031215614a6e57600080fd5b8135613df481614262565b600181811c90821680614a8d57607f821691505b6020821081036129a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561065e57600081815260208120601f850160051c81016020861015614aed5750805b601f850160051c820191505b8181101561085157828155600101614af9565b67ffffffffffffffff831115614b2457614b246140d3565b614b3883614b328354614a79565b83614ac6565b6000601f841160018114614b8a5760008515614b545750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614c20565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614bd95786850135825560209485019460019092019101614bb9565b5086821015614c14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006bffffffffffffffffffffffff80841680614ca457614ca4614c27565b92169190910492915050565b6bffffffffffffffffffffffff828116828216039080821115614cd557614cd5614c56565b5092915050565b805169ffffffffffffffffffff8116811461124257600080fd5b600080600080600060a08688031215614d0e57600080fd5b614d1786614cdc565b9450602086015193506040860151925060608601519150614d3a60808701614cdc565b90509295509295909350565b8181038181111561069a5761069a614c56565b600060208284031215614d6b57600080fd5b8151613df481614638565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dd657614dd6614c56565b5060010190565b68ffffffffffffffffff811681146129e457600080fd5b803561124281614ddd565b60006101608236031215614e1257600080fd5b614e1a61412c565b823567ffffffffffffffff811115614e3157600080fd5b614e3d3682860161419f565b82525060208301356020820152614e5660408401614284565b6040820152614e67606084016142a9565b6060820152614e7860808401614df4565b6080820152614e8960a0840161462d565b60a0820152614e9a60c0840161462d565b60c0820152614eab60e084016145dc565b60e0820152610100614ebe818501614605565b90820152610120614ed084820161462d565b90820152610140614ee2848201614284565b9082015292915050565b600060208284031215614efe57600080fd5b8135613df481614617565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f3e57600080fd5b83018035915067ffffffffffffffff821115614f5957600080fd5b6020019150368190038213156132cf57600080fd5b600060208284031215614f8057600080fd5b613df482614605565b600060208284031215614f9b57600080fd5b8135613df4816145ca565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a166020830152881660408201526102406060820181905281018690526000610260878982850137600083890182015261ffff8716608084015260a0830186905263ffffffff851660c0840152601f88017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016830101905061504e60e08301846143a6565b9a9950505050505050505050565b60ff818116838216019081111561069a5761069a614c56565b600060ff83168061508857615088614c27565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b808202811582820484141761069a5761069a614c56565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff818116838216019080821115614cd557614cd5614c56565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261517d8184018a6142ed565b9050828103608084015261519181896142ed565b905060ff871660a084015282810360c08401526151ae8187614076565b905067ffffffffffffffff851660e08401528281036101008401526151d38185614076565b9c9b505050505050505050505050565b805161124281614ddd565b60006020828403121561520057600080fd5b8151613df481614ddd565b600181815b8085111561526457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561524a5761524a614c56565b8085161561525757918102915b93841c9390800290615210565b509250929050565b60008261527b5750600161069a565b816152885750600061069a565b816001811461529e57600281146152a8576152c4565b600191505061069a565b60ff8411156152b9576152b9614c56565b50506001821b61069a565b5060208310610133831016604e8410600b84101617156152e7575081810a61069a565b6152f1838361520b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561532357615323614c56565b029392505050565b6000613df460ff84168361526c565b60008261534957615349614c27565b500490565b6bffffffffffffffffffffffff818116838216019080821115614cd557614cd5614c56565b6bffffffffffffffffffffffff81811683821602808216919082811461487f5761487f614c56565b8082018082111561069a5761069a614c56565b67ffffffffffffffff818116838216019080821115614cd557614cd5614c56565b600082601f8301126153e057600080fd5b813560206153f061493c836148f7565b82815260059290921b8401810191818101908684111561540f57600080fd5b8286015b848110156149845780358352918301918301615413565b600082601f83011261543b57600080fd5b8135602061544b61493c836148f7565b82815260059290921b8401810191818101908684111561546a57600080fd5b8286015b8481101561498457803567ffffffffffffffff81111561548e5760008081fd5b61549c8986838b010161419f565b84525091830191830161546e565b600080600080600060a086880312156154c257600080fd5b853567ffffffffffffffff808211156154da57600080fd5b6154e689838a016153cf565b965060208801359150808211156154fc57600080fd5b61550889838a0161542a565b9550604088013591508082111561551e57600080fd5b61552a89838a0161542a565b9450606088013591508082111561554057600080fd5b61554c89838a0161542a565b9350608088013591508082111561556257600080fd5b5061556f8882890161542a565b9150509295509295909350565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526155c38285018b6142ed565b915083820360808501526155d7828a6142ed565b915060ff881660a085015283820360c08501526155f48288614076565b90861660e085015283810361010085015290506151d38185614076565b805161124281614262565b80516112428161428f565b805161124281614617565b8051611242816145ca565b8051611242816145e7565b6000610160828403121561565b57600080fd5b61566361412c565b8251815261567360208401615611565b60208201526156846040840161561c565b604082015261569560608401615611565b60608201526156a660808401615627565b60808201526156b760a08401615632565b60a08201526156c860c084016151e3565b60c08201526156d960e084016151e3565b60e08201526101006156ec81850161563d565b908201526101206156fe84820161563d565b9082015261014061475f848201615632565b64ffffffffff818116838216019080821115614cd557614cd5614c56565b60006102008083526157428184018a614076565b905082810360208401526157568189614076565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff86166080850152915061579f905060a08301846143a6565b979650505050505050565b600080604083850312156157bd57600080fd5b8251600781106157cc57600080fd5b60208401519092506142e28161428f565b6000602082840312156157ef57600080fd5b5051919050565b60008351615808818460208801614052565b83519083019061581c818360208801614052565b01949350505050565b60006020828403121561583757600080fd5b8151613df48161426256fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a", } var FunctionsCoordinatorABI = FunctionsCoordinatorMetaData.ABI diff --git a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt index bf74137743e..3bb99476d9a 100644 --- a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,10 +1,10 @@ GETH_VERSION: 1.13.14 functions: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.bin 3c972870b0afeb6d73a29ebb182f24956a2cebb127b21c4f867d1ecf19a762db -functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 268de8b3c061b53a1a2a1ccc0149eff68545959e29cd41b5f2e9f5dab19075cf +functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 0c2156289e11f884ca6e92bf851192d3917c9094a0a301bcefa61266678d0e57 functions_billing_registry_events_mock: ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.abi ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.bin 50deeb883bd9c3729702be335c0388f9d8553bab4be5e26ecacac496a89e2b77 functions_client: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.bin 2368f537a04489c720a46733f8596c4fc88a31062ecfa966d05f25dd98608aca functions_client_example: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.bin abf32e69f268f40e8530eb8d8e96bf310b798a4c0049a58022d9d2fb527b601b -functions_coordinator: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.bin 97a625c7ce8c8c167faad5e532a5894a52af5dee722b2da7e7528f5eaa32a0fe +functions_coordinator: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.bin 292d4742d039a154ed7875a0167c9725e2a90674ad9a05f152377819bb991082 functions_load_test_client: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsLoadTestClient.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsLoadTestClient.bin c8dbbd5ebb34435800d6674700068837c3a252db60046a14b0e61e829db517de functions_oracle_events_mock: ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsOracleEventsMock.abi ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsOracleEventsMock.bin 3ca70f966f8fe751987f0ccb50bebb6aa5be77e4a9f835d1ae99e0e9bfb7d52c functions_router: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRouter.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRouter.bin 1f6d18f9e0846ad74b37a0a6acef5942ab73ace1e84307f201899f69e732e776 diff --git a/core/gethwrappers/keystone/generated/forwarder/forwarder.go b/core/gethwrappers/keystone/generated/forwarder/forwarder.go index fbdd024c64f..c66e2886793 100644 --- a/core/gethwrappers/keystone/generated/forwarder/forwarder.go +++ b/core/gethwrappers/keystone/generated/forwarder/forwarder.go @@ -31,8 +31,8 @@ var ( ) var KeystoneForwarderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"InvalidDonId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"}],\"name\":\"ReportAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"ReportProcessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61151d806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806379ba50971161005b57806379ba5097146101175780638da5cb5b1461011f578063c0965dc31461013d578063f2fde38b1461015057600080fd5b8063134a46f014610082578063181f5a7714610097578063390d0b15146100df575b600080fd5b610095610090366004611106565b610163565b005b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100d691906111de565b60405180910390f35b6100f26100ed366004611221565b61057d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61009561060e565b60005473ffffffffffffffffffffffffffffffffffffffff166100f2565b61009561014b36600461124b565b61070b565b61009561015e3660046112fa565b610ded565b60015474010000000000000000000000000000000000000000900460ff16156101b8576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560ff8316600003610234576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f81111561027e576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101829052601f60248201526044015b60405180910390fd5b610289836003611344565b60ff1681116102e7578061029e846003611344565b6102a9906001611367565b6040517f9dd9e6d8000000000000000000000000000000000000000000000000000000008152600481019290925260ff166024820152604401610275565b60005b63ffffffff85166000908152600260205260409020600101548110156103885763ffffffff8516600090815260026020526040812060010180548390811061033457610334611380565b600091825260208083209091015463ffffffff891683526002808352604080852073ffffffffffffffffffffffffffffffffffffffff9093168552910190915281205550610381816113af565b90506102ea565b5063ffffffff841660009081526002602052604090206103ac906001018383610ffe565b5060005b8181101561050a5760008383838181106103cc576103cc611380565b90506020020160208101906103e191906112fa565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290920190529020549091501561046c576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610477826001611367565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616808552868401835290842060ff959095169094559081526001938401805494850181558252902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055610503816113af565b90506103b0565b50505063ffffffff91909116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b6000806105df84846040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff169150505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461068f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610275565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60015474010000000000000000000000000000000000000000900460ff1615610760576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560588310156107da576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061081f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e0192505050565b63ffffffff8316600090815260026020526040812054949850929650909450925060ff9091169003610885576040517fea1b312900000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610275565b604080517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260039092529190205473ffffffffffffffffffffffffffffffffffffffff1615610939576040517f1aac3d2900000000000000000000000000000000000000000000000000000000815260048101829052602401610275565b63ffffffff8416600090815260026020526040902054869061095f9060ff166001611367565b60ff16146109ca5763ffffffff841660009081526002602052604090205461098b9060ff166001611367565b6040517fd6022e8e00000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101879052604401610275565b600089896040516109dc9291906113e7565b604051809103902090506109ee611086565b6000805b89811015610c5c576000806000610a608e8e86818110610a1457610a14611380565b9050602002810190610a2691906113f7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2692505050565b925092509250600060018883868660405160008152602001604052604051610aa4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610ac6573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015163ffffffff8f1660009081526002602081815284832073ffffffffffffffffffffffffffffffffffffffff851684529091019052918220549850925060ff881690039050610b81576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610b8c60018761145c565b955060008760ff8816601f8110610ba557610ba5611380565b602002015173ffffffffffffffffffffffffffffffffffffffff1614610c0f576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b80878760ff16601f8110610c2557610c25611380565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015250610c5592508391506113af9050565b90506109f2565b5050505060008a905060008173ffffffffffffffffffffffffffffffffffffffff1663ff5a027088868e8e6058908092610c9893929190611475565b6040518563ffffffff1660e01b8152600401610cb7949392919061149f565b600060405180830381600087803b158015610cd157600080fd5b505af1925050508015610ce2575060015b15610ceb575060015b604080518082018252338152821515602080830191825260008781526003909152839020915182549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91821617919091179091559051869186811691908f16907fdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c208190610daf90861515815260200190565b60405180910390a45050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905550505050505050505050565b610df5610e86565b610dfe81610f09565b50565b602081015160408201516044830151606490930151919360e09190911c929160601c90565b60008060006041845114610e6857836040517f2adfdc3000000000000000000000000000000000000000000000000000000000815260040161027591906111de565b50505060208101516040820151606090920151909260009190911a90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610275565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610275565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611076579160200282015b828111156110765781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061101e565b506110829291506110a5565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561108257600081556001016110a6565b60008083601f8401126110cc57600080fd5b50813567ffffffffffffffff8111156110e457600080fd5b6020830191508360208260051b85010111156110ff57600080fd5b9250929050565b6000806000806060858703121561111c57600080fd5b843563ffffffff8116811461113057600080fd5b9350602085013560ff8116811461114657600080fd5b9250604085013567ffffffffffffffff81111561116257600080fd5b61116e878288016110ba565b95989497509550505050565b6000815180845260005b818110156111a057602081850181015186830182015201611184565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006111f1602083018461117a565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461121c57600080fd5b919050565b6000806040838503121561123457600080fd5b61123d836111f8565b946020939093013593505050565b60008060008060006060868803121561126357600080fd5b61126c866111f8565b9450602086013567ffffffffffffffff8082111561128957600080fd5b818801915088601f83011261129d57600080fd5b8135818111156112ac57600080fd5b8960208285010111156112be57600080fd5b6020830196508095505060408801359150808211156112dc57600080fd5b506112e9888289016110ba565b969995985093965092949392505050565b60006020828403121561130c57600080fd5b6111f1826111f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216029081169081811461136057611360611315565b5092915050565b60ff818116838216019081111561060857610608611315565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113e0576113e0611315565b5060010190565b8183823760009101908152919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261142c57600080fd5b83018035915067ffffffffffffffff82111561144757600080fd5b6020019150368190038213156110ff57600080fd5b60ff828116828216039081111561060857610608611315565b6000808585111561148557600080fd5b8386111561149257600080fd5b5050820193919092039150565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b610c12806101576000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063c0965dc311610050578063c0965dc314610108578063e6b714581461012b578063f2fde38b1461016157600080fd5b8063181f5a771461007757806379ba5097146100bf5780638da5cb5b146100c9575b600080fd5b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100b69190610827565b60405180910390f35b6100c7610174565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b6565b61011b6101163660046108bc565b610276565b60405190151581526020016100b6565b6100e3610139366004610998565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6100c761016f3660046109b1565b61058e565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60025460009060ff16156102b6576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556044841161034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e6774680000000000000000000000000060448201526064016101f1565b600061035a85600481896109d3565b8101906103679190610a2c565b8051602082012090915060005b848110156104655760008060006103e289898681811061039657610396610afb565b90506020028101906103a89190610b2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a292505050565b925092509250600060018683868660405160008152602001604052604051610426949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610448573d6000803e3d6000fd5b5086955061045d9450859350610b9692505050565b915050610374565b5060008061047284610630565b600081815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff16156104ae57600094505050505061055d565b6000808b73ffffffffffffffffffffffffffffffffffffffff168b8b6040516104d8929190610bf5565b6000604051808303816000865af19150503d8060008114610515576040519150601f19603f3d011682016040523d82523d6000602084013e61051a565b606091505b5050506000928352505060036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001925050505b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905595945050505050565b6105966106af565b61059f81610732565b50565b60008060008351604114610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016101f1565b50505060208101516040820151606090920151909260009190911a90565b600080604083511161069e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207265706f7274206c656e677468000000000000000000000060448201526064016101f1565b505060208101516040909101519091565b60005473ffffffffffffffffffffffffffffffffffffffff163314610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016101f1565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016101f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208083528351808285015260005b8181101561085457858101830151858201604001528201610838565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b757600080fd5b919050565b6000806000806000606086880312156108d457600080fd5b6108dd86610893565b9450602086013567ffffffffffffffff808211156108fa57600080fd5b818801915088601f83011261090e57600080fd5b81358181111561091d57600080fd5b89602082850101111561092f57600080fd5b60208301965080955050604088013591508082111561094d57600080fd5b818801915088601f83011261096157600080fd5b81358181111561097057600080fd5b8960208260051b850101111561098557600080fd5b9699959850939650602001949392505050565b6000602082840312156109aa57600080fd5b5035919050565b6000602082840312156109c357600080fd5b6109cc82610893565b9392505050565b600080858511156109e357600080fd5b838611156109f057600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610a3e57600080fd5b813567ffffffffffffffff80821115610a5657600080fd5b818401915084601f830112610a6a57600080fd5b813581811115610a7c57610a7c6109fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ac257610ac26109fd565b81604052828152876020848701011115610adb57600080fd5b826020860160208301376000928101602001929092525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b5f57600080fd5b83018035915067ffffffffffffffff821115610b7a57600080fd5b602001915036819003821315610b8f57600080fd5b9250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818382376000910190815291905056fea164736f6c6343000813000a", } var KeystoneForwarderABI = KeystoneForwarderMetaData.ABI @@ -171,9 +171,9 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transact(opts *bind.Tr return _KeystoneForwarder.Contract.contract.Transact(opts, method, params...) } -func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { +func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) { var out []interface{} - err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", receiver, workflowExecutionId) + err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", workflowExecutionId) if err != nil { return *new(common.Address), err @@ -185,12 +185,12 @@ func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.Cal } -func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) } -func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) } func (_KeystoneForwarder *KeystoneForwarderCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -249,28 +249,16 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AcceptOwnership() return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts) } -func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "report", receiverAddress, rawReport, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "report", targetAddress, data, signatures) } -func (_KeystoneForwarder *KeystoneForwarderSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) +func (_KeystoneForwarder *KeystoneForwarderSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) } -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) -} - -func (_KeystoneForwarder *KeystoneForwarderTransactor) SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "setConfig", donId, f, signers) -} - -func (_KeystoneForwarder *KeystoneForwarderSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) -} - -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) } func (_KeystoneForwarder *KeystoneForwarderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -557,160 +545,12 @@ func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferred(l return event, nil } -type KeystoneForwarderReportProcessedIterator struct { - Event *KeystoneForwarderReportProcessed - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *KeystoneForwarderReportProcessedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(KeystoneForwarderReportProcessed) - 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(KeystoneForwarderReportProcessed) - 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 *KeystoneForwarderReportProcessedIterator) Error() error { - return it.fail -} - -func (it *KeystoneForwarderReportProcessedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type KeystoneForwarderReportProcessed struct { - Receiver common.Address - WorkflowOwner common.Address - WorkflowExecutionId [32]byte - Result bool - Raw types.Log -} - -func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) { - - var receiverRule []interface{} - for _, receiverItem := range receiver { - receiverRule = append(receiverRule, receiverItem) - } - var workflowOwnerRule []interface{} - for _, workflowOwnerItem := range workflowOwner { - workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) - } - var workflowExecutionIdRule []interface{} - for _, workflowExecutionIdItem := range workflowExecutionId { - workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) - } - - logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) - if err != nil { - return nil, err - } - return &KeystoneForwarderReportProcessedIterator{contract: _KeystoneForwarder.contract, event: "ReportProcessed", logs: logs, sub: sub}, nil -} - -func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) { - - var receiverRule []interface{} - for _, receiverItem := range receiver { - receiverRule = append(receiverRule, receiverItem) - } - var workflowOwnerRule []interface{} - for _, workflowOwnerItem := range workflowOwner { - workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) - } - var workflowExecutionIdRule []interface{} - for _, workflowExecutionIdItem := range workflowExecutionId { - workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) - } - - logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(KeystoneForwarderReportProcessed) - if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) { - event := new(KeystoneForwarderReportProcessed) - if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - func (_KeystoneForwarder *KeystoneForwarder) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _KeystoneForwarder.abi.Events["OwnershipTransferRequested"].ID: return _KeystoneForwarder.ParseOwnershipTransferRequested(log) case _KeystoneForwarder.abi.Events["OwnershipTransferred"].ID: return _KeystoneForwarder.ParseOwnershipTransferred(log) - case _KeystoneForwarder.abi.Events["ReportProcessed"].ID: - return _KeystoneForwarder.ParseReportProcessed(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) @@ -725,16 +565,12 @@ func (KeystoneForwarderOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } -func (KeystoneForwarderReportProcessed) Topic() common.Hash { - return common.HexToHash("0xdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c2081") -} - func (_KeystoneForwarder *KeystoneForwarder) Address() common.Address { return _KeystoneForwarder.address } type KeystoneForwarderInterface interface { - GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) + GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -742,9 +578,7 @@ type KeystoneForwarderInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) - - SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) + Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) @@ -760,12 +594,6 @@ type KeystoneForwarderInterface interface { ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error) - FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) - - WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) - - ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) - ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt deleted file mode 100644 index 54d1355c62f..00000000000 --- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ /dev/null @@ -1,4 +0,0 @@ -GETH_VERSION: 1.13.8 -forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin ed9164cfe4619dff824b11df46b66f4c6834b2ca072923f10d9ebc57ce508ed8 -keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin d4e0661491c2adc7f0d7553287c938fb32664b9f07770f6d57ae6511ce9884cd -ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2 diff --git a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 1569801b3fb..a30823b737f 100644 --- a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ -GETH_VERSION: 1.13.8 +GETH_VERSION: 1.13.14 authorized_forwarder: ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.abi ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.bin 8ea76c883d460f8353a45a493f2aebeb5a2d9a7b4619d1bc4fff5fb590bb3e10 authorized_receiver: ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.abi ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.bin 18e8969ba3234b027e1b16c11a783aca58d0ea5c2361010ec597f134b7bf1c4f link_token_receiver: ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.abi ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.bin 839552e2bea179bdf2591805422fb33769c1646d5a014a00fc2c0cd9c03ef229 diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index 8dc355e4741..84574242b73 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -26,6 +26,7 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" + "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 027c799494b..6ebf381dfe0 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -225,7 +225,6 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { _, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1)))) require.NoError(t, err) - backend.Commit() ids, addrs, contracts := deployUpkeeps(t, backend, carrol, steve, linkToken, registry, upkeeps) @@ -511,19 +510,19 @@ 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)) - h, err := backend.HeaderByNumber(testutils.Context(t), nil) - require.NoError(t, err) - startBlock := h.Number.Int64() - // 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) - }) - }() + h, err := backend.HeaderByNumber(testutils.Context(t), nil) + require.NoError(t, err) + startBlock := h.Number.Int64() + // 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) + }) + }() go makeDummyBlocks(t, backend, 3*time.Second, 1000) diff --git a/go.mod b/go.mod index 81160f3fb26..9b181b288ca 100644 --- a/go.mod +++ b/go.mod @@ -67,6 +67,7 @@ require ( github.com/prometheus/prometheus v0.48.1 github.com/robfig/cron/v3 v3.0.1 github.com/rogpeppe/go-internal v1.11.0 + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/scylladb/go-reflectx v1.0.1 github.com/shirou/gopsutil/v3 v3.24.3 github.com/shopspring/decimal v1.3.1 @@ -282,7 +283,6 @@ require ( github.com/rivo/uniseg v0.4.4 // indirect github.com/rs/cors v1.8.3 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect From ecf5baac785205cbe2591e491ade068d1f4964fb Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Mon, 6 May 2024 13:43:20 -0700 Subject: [PATCH 02/30] Update SimulatedBackendClient to wrap simulated.Backend & simulated.Client ( instead of deprecated backends.SimulatedBackendClient ) --- .../evm/client/simulated_backend_client.go | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index e12c1855292..20dddb2599e 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -12,10 +12,10 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/rpc" "github.com/smartcontractkit/chainlink-common/pkg/utils/hex" @@ -66,15 +66,17 @@ var ( // SimulatedBackendClient is an Client implementation using a simulated // blockchain backend. Note that not all RPC methods are implemented here. type SimulatedBackendClient struct { - b *backends.SimulatedBackend + b *simulated.Backend + client simulated.Client t testing.TB chainId *big.Int } // NewSimulatedBackendClient creates an eth client backed by a simulated backend. -func NewSimulatedBackendClient(t testing.TB, b *backends.SimulatedBackend, chainId *big.Int) *SimulatedBackendClient { +func NewSimulatedBackendClient(t testing.TB, b *simulated.Backend, chainId *big.Int) *SimulatedBackendClient { return &SimulatedBackendClient{ b: b, + client: b.Client(), t: t, chainId: chainId, } @@ -113,13 +115,13 @@ func (c *SimulatedBackendClient) CallContext(ctx context.Context, result interfa // FilterLogs returns all logs that respect the passed filter query. func (c *SimulatedBackendClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) (logs []types.Log, err error) { - return c.b.FilterLogs(ctx, q) + return c.client.FilterLogs(ctx, q) } // SubscribeFilterLogs registers a subscription for push notifications of logs // from a given address. func (c *SimulatedBackendClient) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, channel chan<- types.Log) (ethereum.Subscription, error) { - return c.b.SubscribeFilterLogs(ctx, q, channel) + return c.client.SubscribeFilterLogs(ctx, q, channel) } func (c *SimulatedBackendClient) TokenBalance(ctx context.Context, address common.Address, contractAddress common.Address) (balance *big.Int, err error) { @@ -128,7 +130,7 @@ func (c *SimulatedBackendClient) TokenBalance(ctx context.Context, address commo return nil, fmt.Errorf("%w: while seeking the ERC20 balance of %s on %s", err, address, contractAddress) } - b, err := c.b.CallContract(ctx, ethereum.CallMsg{ + b, err := c.client.CallContract(ctx, ethereum.CallMsg{ To: &contractAddress, Data: callData}, big.NewInt(int64(rpc.LatestBlockNumber))) if err != nil { @@ -149,11 +151,11 @@ func (c *SimulatedBackendClient) LINKBalance(ctx context.Context, address common // TransactionReceipt returns the transaction receipt for the given transaction hash. func (c *SimulatedBackendClient) TransactionReceipt(ctx context.Context, receipt common.Hash) (*types.Receipt, error) { - return c.b.TransactionReceipt(ctx, receipt) + return c.client.TransactionReceipt(ctx, receipt) } func (c *SimulatedBackendClient) TransactionByHash(ctx context.Context, txHash common.Hash) (tx *types.Transaction, err error) { - tx, _, err = c.b.TransactionByHash(ctx, txHash) + tx, _, err = c.client.TransactionByHash(ctx, txHash) return } @@ -163,7 +165,7 @@ func (c *SimulatedBackendClient) blockNumber(ctx context.Context, number interfa switch n { case "latest": var n uint64 - n, err = c.b.BlockNumber(ctx) + n, err = c.client.BlockNumber(ctx) if err != nil { return } @@ -174,7 +176,7 @@ func (c *SimulatedBackendClient) blockNumber(ctx context.Context, number interfa return big.NewInt(0), nil case "pending": var h *types.Header - h, err = c.b.HeaderByNumber(ctx, new(big.Int).SetInt64(rpc.PendingBlockNumber.Int64())) + h, err = c.client.HeaderByNumber(ctx, new(big.Int).SetInt64(rpc.PendingBlockNumber.Int64())) if err != nil { return } @@ -182,7 +184,7 @@ func (c *SimulatedBackendClient) blockNumber(ctx context.Context, number interfa return case "finalized": var h *types.Header - h, err = c.b.HeaderByNumber(ctx, new(big.Int).SetInt64(rpc.FinalizedBlockNumber.Int64())) + h, err = c.client.HeaderByNumber(ctx, new(big.Int).SetInt64(rpc.FinalizedBlockNumber.Int64())) if err != nil { return } @@ -213,7 +215,7 @@ func (c *SimulatedBackendClient) HeadByNumber(ctx context.Context, n *big.Int) ( if n == nil { n = big.NewInt(int64(rpc.LatestBlockNumber)) } - header, err := c.b.HeaderByNumber(ctx, n) + header, err := c.client.HeaderByNumber(ctx, n) if err != nil { return nil, err } else if header == nil { @@ -230,7 +232,7 @@ func (c *SimulatedBackendClient) HeadByNumber(ctx context.Context, n *big.Int) ( // HeadByHash returns our own header type. func (c *SimulatedBackendClient) HeadByHash(ctx context.Context, h common.Hash) (*evmtypes.Head, error) { - header, err := c.b.HeaderByHash(ctx, h) + header, err := c.client.HeaderByHash(ctx, h) if err != nil { return nil, err } else if header == nil { @@ -247,16 +249,16 @@ func (c *SimulatedBackendClient) HeadByHash(ctx context.Context, h common.Hash) // BlockByNumber returns a geth block type. func (c *SimulatedBackendClient) BlockByNumber(ctx context.Context, n *big.Int) (*types.Block, error) { - return c.b.BlockByNumber(ctx, n) + return c.client.BlockByNumber(ctx, n) } // BlockByNumber returns a geth block type. func (c *SimulatedBackendClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - return c.b.BlockByHash(ctx, hash) + return c.client.BlockByHash(ctx, hash) } func (c *SimulatedBackendClient) LatestBlockHeight(ctx context.Context) (*big.Int, error) { - header, err := c.b.HeaderByNumber(ctx, nil) + header, err := c.client.HeaderByNumber(ctx, nil) return header.Number, err } @@ -272,18 +274,18 @@ func (c *SimulatedBackendClient) ChainID() (*big.Int, error) { // PendingNonceAt gets pending nonce i.e. mempool nonce. func (c *SimulatedBackendClient) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - return c.b.PendingNonceAt(ctx, account) + return c.client.PendingNonceAt(ctx, account) } // NonceAt gets nonce as of a specified block. func (c *SimulatedBackendClient) SequenceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (evmtypes.Nonce, error) { - nonce, err := c.b.NonceAt(ctx, account, blockNumber) + nonce, err := c.client.NonceAt(ctx, account, blockNumber) return evmtypes.Nonce(nonce), err } // BalanceAt gets balance as of a specified block. func (c *SimulatedBackendClient) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { - return c.b.BalanceAt(ctx, account, blockNumber) + return c.client.BalanceAt(ctx, account, blockNumber) } type headSubscription struct { @@ -313,7 +315,7 @@ func (c *SimulatedBackendClient) SubscribeNewHead( ch := make(chan *types.Header) var err error - subscription.subscription, err = c.b.SubscribeNewHead(ctx, ch) + subscription.subscription, err = c.client.SubscribeNewHead(ctx, ch) if err != nil { return nil, fmt.Errorf("%w: could not subscribe to new heads on "+ "simulated backend", err) @@ -348,11 +350,11 @@ func (c *SimulatedBackendClient) SubscribeNewHead( // HeaderByNumber returns the geth header type. func (c *SimulatedBackendClient) HeaderByNumber(ctx context.Context, n *big.Int) (*types.Header, error) { - return c.b.HeaderByNumber(ctx, n) + return c.client.HeaderByNumber(ctx, n) } func (c *SimulatedBackendClient) HeaderByHash(ctx context.Context, h common.Hash) (*types.Header, error) { - return c.b.HeaderByHash(ctx, h) + return c.client.HeaderByHash(ctx, h) } func (c *SimulatedBackendClient) SendTransactionReturnCode(ctx context.Context, tx *types.Transaction, fromAddress common.Address) (commonclient.SendTxReturnCode, error) { @@ -373,7 +375,7 @@ func (c *SimulatedBackendClient) SendTransaction(ctx context.Context, tx *types. if err != nil { logger.Test(c.t).Panic(fmt.Errorf("invalid transaction: %v (tx: %#v)", err, tx)) } - pendingNonce, err := c.b.PendingNonceAt(ctx, sender) + pendingNonce, err := c.client.PendingNonceAt(ctx, sender) if err != nil { panic(fmt.Errorf("unable to determine nonce for account %s: %v", sender.Hex(), err)) } @@ -384,7 +386,7 @@ func (c *SimulatedBackendClient) SendTransaction(ctx context.Context, tx *types. return nil } - err = c.b.SendTransaction(ctx, tx) + err = c.client.SendTransaction(ctx, tx) return err } @@ -412,7 +414,7 @@ func (c *SimulatedBackendClient) CallContract(ctx context.Context, msg ethereum. // Message string `json:"message"` // Data interface{} `json:"data,omitempty"` //} - res, err := c.b.CallContract(ctx, msg, blockNumber) + res, err := c.client.CallContract(ctx, msg, blockNumber) if err != nil { dataErr := revertError{} if errors.Is(err, &dataErr) { @@ -431,7 +433,7 @@ func (c *SimulatedBackendClient) PendingCallContract(ctx context.Context, msg et // Message string `json:"message"` // Data interface{} `json:"data,omitempty"` //} - res, err := c.b.PendingCallContract(ctx, msg) + res, err := c.client.PendingCallContract(ctx, msg) if err != nil { dataErr := revertError{} if errors.Is(err, &dataErr) { @@ -445,17 +447,17 @@ func (c *SimulatedBackendClient) PendingCallContract(ctx context.Context, msg et // CodeAt gets the code associated with an account as of a specified block. func (c *SimulatedBackendClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { - return c.b.CodeAt(ctx, account, blockNumber) + return c.client.CodeAt(ctx, account, blockNumber) } // PendingCodeAt gets the latest code. func (c *SimulatedBackendClient) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - return c.b.PendingCodeAt(ctx, account) + return c.client.PendingCodeAt(ctx, account) } // EstimateGas estimates gas for a msg. func (c *SimulatedBackendClient) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { - return c.b.EstimateGas(ctx, call) + return c.client.EstimateGas(ctx, call) } // SuggestGasPrice recommends a gas price. @@ -506,10 +508,10 @@ func (c *SimulatedBackendClient) BatchCallContextAll(ctx context.Context, b []rp // SuggestGasTipCap suggests a gas tip cap. func (c *SimulatedBackendClient) SuggestGasTipCap(ctx context.Context) (tipCap *big.Int, err error) { - return c.b.SuggestGasTipCap(ctx) + return c.client.SuggestGasTipCap(ctx) } -func (c *SimulatedBackendClient) Backend() *backends.SimulatedBackend { +func (c *SimulatedBackendClient) Backend() *simulated.Backend { return c.b } @@ -529,17 +531,17 @@ func (c *SimulatedBackendClient) IsL2() bool { func (c *SimulatedBackendClient) fetchHeader(ctx context.Context, blockNumOrTag string) (*types.Header, error) { switch blockNumOrTag { case rpc.SafeBlockNumber.String(): - return c.b.HeaderByNumber(ctx, big.NewInt(int64(rpc.SafeBlockNumber))) + return c.client.HeaderByNumber(ctx, big.NewInt(int64(rpc.SafeBlockNumber))) case rpc.LatestBlockNumber.String(): - return c.b.HeaderByNumber(ctx, big.NewInt(int64(rpc.LatestBlockNumber))) + return c.client.HeaderByNumber(ctx, big.NewInt(int64(rpc.LatestBlockNumber))) case rpc.FinalizedBlockNumber.String(): - return c.b.HeaderByNumber(ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) + return c.client.HeaderByNumber(ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) default: blockNum, ok := new(big.Int).SetString(blockNumOrTag, 0) if !ok { return nil, fmt.Errorf("error while converting block number string: %s to big.Int ", blockNumOrTag) } - return c.b.HeaderByNumber(ctx, blockNum) + return c.client.HeaderByNumber(ctx, blockNum) } } @@ -553,7 +555,7 @@ func (c *SimulatedBackendClient) ethGetTransactionReceipt(ctx context.Context, r return fmt.Errorf("SimulatedBackendClient expected arg to be a hash, got: %T", args[0]) } - receipt, err := c.b.TransactionReceipt(ctx, hash) + receipt, err := c.client.TransactionReceipt(ctx, hash) if err != nil { return err } @@ -625,7 +627,7 @@ func (c *SimulatedBackendClient) ethEstimateGas(ctx context.Context, result inte return fmt.Errorf("SimulatedBackendClient expected second arg to be the string 'latest' or a *big.Int for eth_call, got: %T", args[1]) } - resp, err := c.b.EstimateGas(ctx, toCallMsg(params)) + resp, err := c.client.EstimateGas(ctx, toCallMsg(params)) if err != nil { return err } @@ -656,7 +658,7 @@ func (c *SimulatedBackendClient) ethCall(ctx context.Context, result interface{} return fmt.Errorf("SimulatedBackendClient expected second arg to be the string 'latest' or a *big.Int for eth_call, got: %T", args[1]) } - resp, err := c.b.CallContract(ctx, toCallMsg(params), nil /* always latest block on simulated backend */) + resp, err := c.client.CallContract(ctx, toCallMsg(params), nil /* always latest block on simulated backend */) if err != nil { return err } @@ -687,7 +689,7 @@ func (c *SimulatedBackendClient) ethGetHeaderByNumber(ctx context.Context, resul return fmt.Errorf("SimulatedBackendClient expected first arg to be a string for eth_getHeaderByNumber: %w", err) } - header, err := c.b.HeaderByNumber(ctx, blockNumber) + header, err := c.client.HeaderByNumber(ctx, blockNumber) if err != nil { return err } @@ -703,7 +705,7 @@ func (c *SimulatedBackendClient) ethGetHeaderByNumber(ctx context.Context, resul } func (c *SimulatedBackendClient) LatestFinalizedBlock(ctx context.Context) (*evmtypes.Head, error) { - h, err := c.b.HeaderByNumber(ctx, big.NewInt(rpc.FinalizedBlockNumber.Int64())) + h, err := c.client.HeaderByNumber(ctx, big.NewInt(rpc.FinalizedBlockNumber.Int64())) if err != nil { return nil, err } @@ -773,7 +775,7 @@ func (c *SimulatedBackendClient) ethGetLogs(ctx context.Context, result interfac Addresses: addresses, Topics: topics, } - logs, err := c.b.FilterLogs(ctx, query) + logs, err := c.client.FilterLogs(ctx, query) if err != nil { return err } From f5d9d1cb2350e70adfa3227534ff715863ee982f Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Wed, 8 May 2024 14:44:37 -0700 Subject: [PATCH 03/30] Update LogPoller helper --- core/chains/evm/logpoller/helper_test.go | 27 ++- core/chains/evm/logpoller/log_poller_test.go | 225 +++++++++---------- 2 files changed, 124 insertions(+), 128 deletions(-) diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index a20c9dd493e..3f98ddeef71 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -4,17 +4,18 @@ import ( "context" "database/sql" "math/big" + "os" "strings" "testing" "time" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" pkgerrors "github.com/pkg/errors" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -37,7 +38,8 @@ type TestHarness struct { ChainID, ChainID2 *big.Int ORM, ORM2 logpoller.ORM LogPoller logpoller.LogPollerTest - Client *backends.SimulatedBackend + Client simulated.Client + Backend *simulated.Backend Owner *bind.TransactOpts Emitter1, Emitter2 *log_emitter.LogEmitter EmitterAddress1, EmitterAddress2 common.Address @@ -48,22 +50,23 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { chainID := testutils.NewRandomEVMChainID() chainID2 := testutils.NewRandomEVMChainID() db := pgtest.NewSqlxDB(t) + dataDir, err := os.MkdirTemp("", "simgethdata") + require.NoError(t, err) o := logpoller.NewORM(chainID, db, lggr) o2 := logpoller.NewORM(chainID2, db, lggr) owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + + backend := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6), withDataDir(dataDir)) + ec := backend.Client() // Poll period doesn't matter, we intend to call poll and save logs directly in the test. // Set it to some insanely high value to not interfere with any tests. - esc := client.NewSimulatedBackendClient(t, ec, chainID) - // Mark genesis block as finalized to avoid any nulls in the tests - //TODO OK to drop? - //head := esc.Backend().Blockchain().CurrentHeader() - //esc.Backend().Blockchain().SetFinalized(head) + + esc := client.NewSimulatedBackendClient(t, backend, chainID) if opts.PollPeriod == 0 { opts.PollPeriod = 1 * time.Hour @@ -73,7 +76,8 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { require.NoError(t, err) emitterAddress2, _, emitter2, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) - ec.Commit() + backend.Commit() + return TestHarness{ Lggr: lggr, ChainID: chainID, @@ -82,6 +86,7 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { ORM2: o2, LogPoller: lp, Client: ec, + Backend: backend, Owner: owner, Emitter1: emitter1, Emitter2: emitter2, diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index cb7ae53ba70..24565411ce4 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -10,12 +10,12 @@ import ( "github.com/cometbft/cometbft/libs/rand" "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/params" "github.com/leanovate/gopter" "github.com/leanovate/gopter/gen" @@ -156,7 +156,7 @@ func TestLogPoller_Integration(t *testing.T) { BackupPollerBlockDelay: 100, } th := SetupTH(t, lpOpts) - th.Client.Commit() // Block 2. Ensure we have finality number of blocks + th.Backend.Commit() // Block 2. Ensure we have finality number of blocks ctx := testutils.Context(t) require.NoError(t, th.LogPoller.RegisterFilter(ctx, logpoller.Filter{Name: "Integration test", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}})) @@ -172,7 +172,7 @@ func TestLogPoller_Integration(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. require.NoError(t, th.LogPoller.Start(testutils.Context(t))) @@ -266,7 +266,7 @@ func Test_BackupLogPoller(t *testing.T) { tx, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(i + 7)}) require.NoError(t, err) require.NotNil(t, tx) - th.Client.Commit() + th.Backend.Commit() } ctx := testutils.Context(t) @@ -314,34 +314,39 @@ func Test_BackupLogPoller(t *testing.T) { require.NoError(t, err) require.NotNil(t, tx3) - th.Client.Commit() // commit block 34 with 3 tx's included + th.Backend.Commit() // commit block 34 with 3 tx's included - h, err := th.Client.HeaderByNumber(ctx, nil) // get latest header + b, err := th.Client.BlockByNumber(ctx, nil) require.NoError(t, err) - require.Equal(t, uint64(34), h.Number.Uint64()) + require.Equal(t, uint64(34), b.Number().Uint64()) - // save these 3 receipts for later - receipts := rawdb.ReadReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges) - require.NotZero(t, receipts.Len()) + // save a receipt for later + receipts := rawdb.ReadReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges) + txs := b.Body().Transactions + require.Len(t, txs, 3) + receipt, err := th.Client.TransactionReceipt(ctx, txs[0].Hash()) + require.NoError(t, err) + require.NotZero(t, receipt) - // Simulate a situation where the rpc server has a block, but no logs available for it yet - // this can't happen with geth itself, but can with other clients. - rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), types.Receipts{}) // wipes out all logs for block 34 + //// Simulate a situation where the rpc server has a block, but no logs available for it yet + //// this can't happen with geth itself, but can with other clients. + rawdb.WriteReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), types.Receipts{}) // wipes out all logs for block 34 - body := rawdb.ReadBody(th.EthDB, h.Hash(), h.Number.Uint64()) + body := rawdb.ReadBody(th.EthDB, b.Hash(), b.Number().Uint64()) + require.NotNil(t, body) require.Equal(t, 3, len(body.Transactions)) - txs := body.Transactions // save transactions for later + body.Transactions = types.Transactions{} // number of tx's must match # of logs for GetLogs() to succeed - rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) + rawdb.WriteBody(th.EthDB, b.Hash(), b.Number().Uint64(), body) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) assert.Equal(t, int64(35), currentBlockNumber) // simulate logs becoming available - rawdb.WriteReceipts(th.EthDB, h.Hash(), h.Number.Uint64(), receipts) - require.True(t, rawdb.HasReceipts(th.EthDB, h.Hash(), h.Number.Uint64())) + rawdb.WriteReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), receipts) + require.True(t, rawdb.HasReceipts(th.EthDB, b.Hash(), b.Number().Uint64())) body.Transactions = txs - rawdb.WriteBody(th.EthDB, h.Hash(), h.Number.Uint64(), body) + rawdb.WriteBody(th.EthDB, b.Hash(), b.Number().Uint64(), body) // flush out cached block 34 by reading logs from first 32 blocks query := ethereum.FilterQuery{ @@ -359,9 +364,9 @@ func Test_BackupLogPoller(t *testing.T) { require.NoError(t, err) assert.Equal(t, 0, len(logs)) - th.Client.Commit() - th.Client.Commit() - markBlockAsFinalized(t, th, 34) + th.Backend.Commit() + th.Backend.Commit() + //markBlockAsFinalized(t, th, 34) // Run ordinary poller + backup poller at least once currentBlock, _ := th.LogPoller.LatestBlock(ctx) @@ -376,8 +381,8 @@ func Test_BackupLogPoller(t *testing.T) { logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) - th.Client.Commit() - markBlockAsFinalized(t, th, 35) + th.Backend.Commit() + //markBlockAsFinalized(t, th, 35) // Run ordinary poller + backup poller at least once more th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1) @@ -420,7 +425,7 @@ func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { for i := 0; i < emittedLogs; i++ { _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // First PollAndSave, no filters are registered @@ -431,7 +436,7 @@ func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { // LogPoller not working, but chain in the meantime has progressed // 0 -> 1 -> 2 -> ... -> currentBlock - 10 (finalized) -> .. -> currentBlock - markBlockAsFinalized(t, th, currentBlock-10) + //markBlockAsFinalized(t, th, currentBlock-10) err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", @@ -456,8 +461,8 @@ func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { require.Len(t, logs, emittedLogs-10) // Progressing even more, move blockchain forward by 1 block and mark it as finalized - th.Client.Commit() - markBlockAsFinalized(t, th, currentBlock) + th.Backend.Commit() + //markBlockAsFinalized(t, th, currentBlock) th.LogPoller.BackupPollAndSaveLogs(ctx) // All emitted logs should be backfilled @@ -488,15 +493,15 @@ func TestLogPoller_BackupPollAndSaveLogsWithDeepBlockDelay(t *testing.T) { for i := 0; i < emittedLogs; i++ { _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } // Emit one more empty block - th.Client.Commit() + th.Backend.Commit() header, err := th.Client.HeaderByNumber(ctx, nil) require.NoError(t, err) // Mark everything as finalized - markBlockAsFinalized(t, th, header.Number.Int64()) + //markBlockAsFinalized(t, th, header.Number.Int64()) // First PollAndSave, no filters are registered, but finalization is the same as the latest block // 1 -> 2 -> ... @@ -550,26 +555,27 @@ func TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld(t *testing.T) for i := 1; i <= logsBatch; i++ { _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } // First PollAndSave, no filters are registered, but finalization is the same as the latest block // 1 -> 2 -> ... -> firstBatchBlock firstBatchBlock := th.PollAndSaveLogs(ctx, 1) // Mark current tip of the chain as finalized (after emitting 10 logs) - markBlockAsFinalized(t, th, firstBatchBlock-1) + + //markBlockAsFinalized(t, th, firstBatchBlock-1) // Emit 2nd batch of block for i := 1; i <= logsBatch; i++ { _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(100 + i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } // 1 -> 2 -> ... -> firstBatchBlock (finalized) -> .. -> firstBatchBlock + emitted logs secondBatchBlock := th.PollAndSaveLogs(ctx, firstBatchBlock) // Mark current tip of the block as finalized (after emitting 20 logs) - markBlockAsFinalized(t, th, secondBatchBlock-1) + //markBlockAsFinalized(t, th, secondBatchBlock-1) // Register filter err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ @@ -628,8 +634,8 @@ func TestLogPoller_BlockTimestamps(t *testing.T) { time1 := start + 20 + delay1 time2 := time1 + 20 + delay2 - require.NoError(t, th.Client.AdjustTime(delay1*time.Second)) - hash := th.Client.Commit() + require.NoError(t, th.Backend.AdjustTime(delay1*time.Second)) + hash := th.Backend.Commit() blk, err = th.Client.BlockByHash(ctx, hash) require.NoError(t, err) @@ -638,18 +644,18 @@ func TestLogPoller_BlockTimestamps(t *testing.T) { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - hash = th.Client.Commit() + hash = th.Backend.Commit() blk, err = th.Client.BlockByHash(ctx, hash) require.NoError(t, err) require.Equal(t, big.NewInt(3), blk.Number()) assert.Equal(t, time1, blk.Time()) - require.NoError(t, th.Client.AdjustTime(delay2*time.Second)) - th.Client.Commit() + require.NoError(t, th.Backend.AdjustTime(delay2*time.Second)) + th.Backend.Commit() _, err = th.Emitter2.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) - hash = th.Client.Commit() + hash = th.Backend.Commit() blk, err = th.Client.BlockByHash(ctx, hash) require.NoError(t, err) @@ -703,11 +709,12 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { // Set up a test chain with a log emitting contract deployed. orm := logpoller.NewORM(chainID, db, lggr) // Note this property test is run concurrently and the sim is not threadsafe. - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + backend := simulated.NewBackend(map[common.Address]core.GenesisAccount{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)) + ec := backend.Client() _, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) @@ -718,9 +725,9 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - lp := logpoller.NewLogPoller(orm, client.NewSimulatedBackendClient(t, ec, chainID), lggr, lpOpts) + lp := logpoller.NewLogPoller(orm, client.NewSimulatedBackendClient(t, backend, chainID), lggr, lpOpts) for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. - ec.Commit() + backend.Commit() } currentBlockNumber := int64(1) lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber) @@ -750,7 +757,7 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { if rand.Bool() { // Mine blocks for j := 0; j < int(mineOrReorg[i]); j++ { - ec.Commit() + backend.Commit() latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) t.Log("mined block", latest.Hash()) @@ -762,13 +769,13 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { reorgedBlock := big.NewInt(0).Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i]))) reorg, err1 := ec.BlockByNumber(testutils.Context(t), reorgedBlock) require.NoError(t, err1) - require.NoError(t, ec.Fork(testutils.Context(t), reorg.Hash())) + require.NoError(t, backend.Fork(reorg.Hash())) t.Logf("Reorging from (%v, %x) back to (%v, %x)\n", latest.NumberU64(), latest.Hash(), reorgedBlock.Uint64(), reorg.Hash()) // Actually need to change the block here to trigger the reorg. _, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err1) for j := 0; j < int(mineOrReorg[i]+1); j++ { // Need +1 to make it actually longer height so we detect it. - ec.Commit() + backend.Commit() } latest, err1 = ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err1) @@ -860,7 +867,7 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() // Polling should get us the L1 log. newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) @@ -890,13 +897,13 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { require.NoError(t, err) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) - require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) + require.NoError(t, th.Backend.Fork(lca.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) // Create 2' - th.Client.Commit() + th.Backend.Commit() // Create 3 (we need a new block for us to do any polling and detect the reorg). - th.Client.Commit() + th.Backend.Commit() newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(4), newStart) @@ -912,15 +919,15 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // Test scenario: reorg back to previous tip. // Chain gen <- 1 <- 2 (L1_1) <- 3' (L1_3) <- 4 // \ 2'(L1_2) <- 3 - require.NoError(t, th.Client.Fork(testutils.Context(t), reorgedOutBlock.Hash())) + require.NoError(t, th.Backend.Fork(reorgedOutBlock.Hash())) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) // Create 3' - th.Client.Commit() + th.Backend.Commit() // Create 4 - th.Client.Commit() + th.Backend.Commit() // Mark block 1 as finalized - markBlockAsFinalized(t, th, 1) + //markBlockAsFinalized(t, th, 1) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(5), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) @@ -949,13 +956,13 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { _, err = th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)}) require.NoError(t, err) // Create 4 - th.Client.Commit() + th.Backend.Commit() _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)}) require.NoError(t, err) // Create 5 - th.Client.Commit() + th.Backend.Commit() // Mark block 2 as finalized - markBlockAsFinalized(t, th, 3) + //markBlockAsFinalized(t, th, 3) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(7), newStart) @@ -982,10 +989,10 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { for i := 7; i < 11; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } // Mark block 7 as finalized - markBlockAsFinalized(t, th, 7) + //markBlockAsFinalized(t, th, 7) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(11), newStart) @@ -1011,10 +1018,10 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { for i := 11; i < 18; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } // Mark block 14 as finalized - markBlockAsFinalized(t, th, 14) + //markBlockAsFinalized(t, th, 14) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(18), newStart) @@ -1029,8 +1036,8 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(17), b.NumberU64()) require.Equal(t, uint64(170), b.Time()) - require.NoError(t, th.Client.AdjustTime(1*time.Hour)) - th.Client.Commit() + require.NoError(t, th.Backend.AdjustTime(1*time.Hour)) + th.Backend.Commit() b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) @@ -1079,10 +1086,10 @@ func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) { // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - th.Client.Commit() - th.Client.Commit() - th.Client.Commit() - markBlockAsFinalized(t, th, 3) + th.Backend.Commit() + th.Backend.Commit() + th.Backend.Commit() + //markBlockAsFinalized(t, th, 3) // Polling should get us the L1 log. firstPoll := th.PollAndSaveLogs(testutils.Context(t), 1) @@ -1094,20 +1101,20 @@ func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) { // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) - require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) + require.NoError(t, th.Backend.Fork(lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } - markBlockAsFinalized(t, th, 6) + //markBlockAsFinalized(t, th, 6) secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll) assert.Equal(t, firstPoll, secondPoll) @@ -1170,8 +1177,8 @@ func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { // DB: 1 _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - th.Client.Commit() - markBlockAsFinalized(t, th, 1) + th.Backend.Commit() + //markBlockAsFinalized(t, th, 1) // Polling should get us the L1 log. newStart := th.PollAndSaveLogs(testutils.Context(t), 1) @@ -1188,18 +1195,18 @@ func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { // \ 2'(L1_2) <- 3 <- 4 <- 5 <- 6 (finalized on chain) <- 7 <- 8 <- 9 <- 10 lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) - require.NoError(t, th.Client.Fork(testutils.Context(t), lca.Hash())) + require.NoError(t, th.Backend.Fork(lca.Hash())) // Create 2' _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() // Create 3-10 for i := 3; i < 10; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) - th.Client.Commit() + th.Backend.Commit() } - markBlockAsFinalized(t, th, 6) + //markBlockAsFinalized(t, th, 6) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(10), newStart) @@ -1346,7 +1353,7 @@ func TestLogPoller_GetBlocks_Range(t *testing.T) { require.Error(t, err) assert.Equal(t, "Received unfinalized block 2 while expecting finalized block (latestFinalizedBlockNumber = 1)", err.Error()) - th.Client.Commit() // Commit block #4, so that block #2 is finalized + th.Backend.Commit() // Commit block #4, so that block #2 is finalized // Assert block 2 is not yet in DB _, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 2) @@ -1358,7 +1365,7 @@ func TestLogPoller_GetBlocks_Range(t *testing.T) { assert.Equal(t, 1, len(rpcBlocks)) assert.Equal(t, 2, int(rpcBlocks[0].BlockNumber)) - th.Client.Commit() // commit block #5 so that #3 becomes finalized + th.Backend.Commit() // commit block #5 so that #3 becomes finalized // Assert block 3 is not yet in DB _, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 3) @@ -1429,7 +1436,7 @@ func TestGetReplayFromBlock(t *testing.T) { th := SetupTH(t, lpOpts) // Commit a few blocks for i := 0; i < 10; i++ { - th.Client.Commit() + th.Backend.Commit() } // Nothing in the DB yet, should use whatever we specify. @@ -1444,7 +1451,7 @@ func TestGetReplayFromBlock(t *testing.T) { // Commit a few more so chain is ahead. for i := 0; i < 3; i++ { - th.Client.Commit() + th.Backend.Commit() } // Should take min(latest, requested), in this case latest. requested = int64(15) @@ -1471,20 +1478,21 @@ func TestLogPoller_DBErrorHandling(t *testing.T) { o := logpoller.NewORM(chainID1, db, lggr) owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + backend := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)) + ec := backend.Client() _, _, emitter, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) _, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(9)}) require.NoError(t, err) _, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(7)}) require.NoError(t, err) - ec.Commit() - ec.Commit() - ec.Commit() + backend.Commit() + backend.Commit() + backend.Commit() lpOpts := logpoller.Opts{ PollPeriod: time.Hour, @@ -1493,7 +1501,7 @@ func TestLogPoller_DBErrorHandling(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - lp := logpoller.NewLogPoller(o, client.NewSimulatedBackendClient(t, ec, chainID2), lggr, lpOpts) + lp := logpoller.NewLogPoller(o, client.NewSimulatedBackendClient(t, backend, chainID2), lggr, lpOpts) err = lp.Replay(ctx, 5) // block number too high require.ErrorContains(t, err, "Invalid replay block number") @@ -1655,19 +1663,21 @@ func Test_PollAndQueryFinalizedBlocks(t *testing.T) { for i := 0; i < firstBatchLen; i++ { _, err1 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Mark current head as finalized - //TODO can we skip? - //h := th.Client.Blockchain().CurrentHeader() - //th.Client.Blockchain().SetFinalized(h) + + h, err := th.Client.HeaderByNumber(ctx, nil) + require.NoError(t, err) + assert.NotNil(t, h) + // th.Client.Blockchain().SetFinalized(h) // Generate next blocks, not marked as finalized for i := 0; i < secondBatchLen; i++ { _, err1 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } currentBlock := th.PollAndSaveLogs(ctx, 1) @@ -1740,14 +1750,9 @@ func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { _, err := th.LogPoller.LatestBlock(ctx) require.Error(t, err) - // Mark first block as finalized - //TODO OK to skip? - //h := th.Client.Blockchain().CurrentHeader() - //th.Client.Blockchain().SetFinalized(h) - // Create a couple of blocks for i := 0; i < numberOfBlocks-1; i++ { - th.Client.Commit() + th.Backend.Commit() } th.PollAndSaveLogs(ctx, 1) @@ -1802,7 +1807,7 @@ func Test_CreatedAfterQueriesWithBackfill(t *testing.T) { for i := 0; i < emittedLogs; i++ { _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // First PollAndSave, no filters are registered @@ -1817,8 +1822,8 @@ func Test_CreatedAfterQueriesWithBackfill(t *testing.T) { // Emit blocks to cover finality depth, because backup always backfill up to the one block before last finalized for i := 0; i < int(tt.finalityDepth)+1; i++ { - bh := th.Client.Commit() - markBlockAsFinalizedByHash(t, th, bh) + th.Backend.Commit() + //markBlockAsFinalizedByHash(t, th, bh) } // LogPoller should backfill entire history @@ -1911,20 +1916,6 @@ func Test_PruneOldBlocks(t *testing.T) { } } -func markBlockAsFinalized(t *testing.T, th TestHarness, blockNumber int64) { - _, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(blockNumber)) - require.NoError(t, err) - //TODO ok to skip? - //th.Client.Blockchain().SetFinalized(b.Header()) -} - -func markBlockAsFinalizedByHash(t *testing.T, th TestHarness, blockHash common.Hash) { - _, err := th.Client.BlockByHash(testutils.Context(t), blockHash) - require.NoError(t, err) - //TODO ok to skip? - //th.Client.Blockchain().SetFinalized(b.Header()) -} - func TestFindLCA(t *testing.T) { ctx := testutils.Context(t) ec := evmtest.NewEthClientMockWithDefaultChain(t) From a92875435165f62bf492fa5915a4bbb28995648c Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 9 May 2024 20:23:26 -0700 Subject: [PATCH 04/30] Add support for switching rpc clients in simulated geth --- .../evm/client/simulated_backend_client.go | 31 +++++++++++++++---- core/chains/evm/logpoller/helper_test.go | 24 ++++++++------ core/internal/cltest/simulated_backend.go | 4 +-- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index 20dddb2599e..b736a6e649c 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -66,10 +66,11 @@ var ( // SimulatedBackendClient is an Client implementation using a simulated // blockchain backend. Note that not all RPC methods are implemented here. type SimulatedBackendClient struct { - b *simulated.Backend - client simulated.Client - t testing.TB - chainId *big.Int + b *simulated.Backend + client simulated.Client + t testing.TB + chainId *big.Int + optimismMode bool } // NewSimulatedBackendClient creates an eth client backed by a simulated backend. @@ -82,6 +83,17 @@ func NewSimulatedBackendClient(t testing.TB, b *simulated.Backend, chainId *big. } } +// Switch to a new backend client (simulating an rpc failover event) +// If optimismMode = true, the new backend will exhibit the non-geth behavior of optimism (and some other rpc clients), +// where success rather than an error code is returned when a call to FilterLogs() fails to find the block hash +// requested. This combined with a failover event can lead to the "eventual consistency" behavior that Backup LogPoller +// and other solutions were designed to recover from. +func (c *SimulatedBackendClient) SetBackend(backend *simulated.Backend, optimismMode bool) { + c.optimismMode = optimismMode + c.b = backend + c.client = backend.Client() +} + // Dial noop for the sim. func (c *SimulatedBackendClient) Dial(context.Context) error { return nil @@ -115,7 +127,14 @@ func (c *SimulatedBackendClient) CallContext(ctx context.Context, result interfa // FilterLogs returns all logs that respect the passed filter query. func (c *SimulatedBackendClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) (logs []types.Log, err error) { - return c.client.FilterLogs(ctx, q) + logs, err = c.client.FilterLogs(ctx, q) + if c.optimismMode { + if err != nil && err.Error() == "unknown block" { + return []types.Log{}, nil // emulate optimism behavior of returning success instead of "unknown block" + } + } + + return logs, err } // SubscribeFilterLogs registers a subscription for push notifications of logs @@ -775,7 +794,7 @@ func (c *SimulatedBackendClient) ethGetLogs(ctx context.Context, result interfac Addresses: addresses, Topics: topics, } - logs, err := c.client.FilterLogs(ctx, query) + logs, err := c.FilterLogs(ctx, query) if err != nil { return err } diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index 3f98ddeef71..e5fc1404836 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "math/big" - "os" "strings" "testing" "time" @@ -38,7 +37,7 @@ type TestHarness struct { ChainID, ChainID2 *big.Int ORM, ORM2 logpoller.ORM LogPoller logpoller.LogPollerTest - Client simulated.Client + Client *client.SimulatedBackendClient Backend *simulated.Backend Owner *bind.TransactOpts Emitter1, Emitter2 *log_emitter.LogEmitter @@ -50,8 +49,8 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { chainID := testutils.NewRandomEVMChainID() chainID2 := testutils.NewRandomEVMChainID() db := pgtest.NewSqlxDB(t) - dataDir, err := os.MkdirTemp("", "simgethdata") - require.NoError(t, err) + //dataDir, err := os.MkdirTemp("", "simgethdata") + //require.NoError(t, err) o := logpoller.NewORM(chainID, db, lggr) o2 := logpoller.NewORM(chainID2, db, lggr) @@ -61,8 +60,8 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, simulated.WithBlockGasLimit(10e6), withDataDir(dataDir)) - ec := backend.Client() + }, simulated.WithBlockGasLimit(10e6)) + // Poll period doesn't matter, we intend to call poll and save logs directly in the test. // Set it to some insanely high value to not interfere with any tests. @@ -72,9 +71,9 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { opts.PollPeriod = 1 * time.Hour } lp := logpoller.NewLogPoller(o, esc, lggr, opts) - emitterAddress1, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) + emitterAddress1, _, emitter1, err := log_emitter.DeployLogEmitter(owner, backend.Client()) require.NoError(t, err) - emitterAddress2, _, emitter2, err := log_emitter.DeployLogEmitter(owner, ec) + emitterAddress2, _, emitter2, err := log_emitter.DeployLogEmitter(owner, backend.Client()) require.NoError(t, err) backend.Commit() @@ -85,7 +84,7 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { ORM: o, ORM2: o2, LogPoller: lp, - Client: ec, + Client: esc, Backend: backend, Owner: owner, Emitter1: emitter1, @@ -117,3 +116,10 @@ func (th *TestHarness) assertHaveCanonical(t *testing.T, start, end int) { assert.Equal(t, chainBlk.Hash().Bytes(), blk.BlockHash.Bytes(), "block %v", i) } } + +// Simulates an RPC failover event to an alternate rpc server. This can also be used to +// simulate switching back to the primary rpc after it recovers. +func (th *TestHarness) SetActiveClient(backend *simulated.Backend, optimismMode bool) { + th.Backend = backend + th.Client.SetBackend(backend, optimismMode) +} diff --git a/core/internal/cltest/simulated_backend.go b/core/internal/cltest/simulated_backend.go index 8be7ba78275..b3714208547 100644 --- a/core/internal/cltest/simulated_backend.go +++ b/core/internal/cltest/simulated_backend.go @@ -40,7 +40,7 @@ func NewApplicationWithConfigV2OnSimulatedBlockchain( require.Zero(t, evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()).Cmp(testutils.SimulatedChainID)) chainID := big.New(testutils.SimulatedChainID) - client := client.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID) + client := client.NewSimulatedBackendClient(t, backend.Backend, testutils.SimulatedChainID) flagsAndDeps = append(flagsAndDeps, client, chainID) @@ -66,7 +66,7 @@ func NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain( require.Zero(t, evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()).Cmp(testutils.SimulatedChainID)) chainID := big.New(testutils.SimulatedChainID) - client := client.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID) + client := client.NewSimulatedBackendClient(t, backend.Backend, testutils.SimulatedChainID) flagsAndDeps = append(flagsAndDeps, client, chainID) From c63a471cd9453a1d080df27abf2d414486fd7a9f Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 9 May 2024 20:25:52 -0700 Subject: [PATCH 05/30] Fix TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld This test relied on markBlockFinalized() which has been replaced with finalizedBlocksThrough(). Just needed some slight adjustments to keep testing the same thing. --- core/chains/evm/logpoller/log_poller_test.go | 115 +++++++++++-------- 1 file changed, 65 insertions(+), 50 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 24565411ce4..53834d085ed 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -13,10 +13,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient/simulated" - "github.com/ethereum/go-ethereum/params" "github.com/leanovate/gopter" "github.com/leanovate/gopter/gen" "github.com/leanovate/gopter/prop" @@ -226,8 +224,9 @@ func TestLogPoller_Integration(t *testing.T) { assert.ErrorIs(t, th.LogPoller.Replay(ctx, 4), logpoller.ErrReplayRequestAborted) } -// Simulate a badly behaving rpc server, where unfinalized blocks can return different logs -// for the same block hash. We should be able to handle this without missing any logs, as +// Simulate an rpc failover event on optimism, where logs are requested from a block hash which doesn't +// exist on the new rpc server, but a successful error code is returned. This is bad/buggy behavior on the +// part of the rpc server, but we should be able to handle this without missing any logs, as // long as the logs returned for finalized blocks are consistent. func Test_BackupLogPoller(t *testing.T) { tests := []struct { @@ -316,57 +315,56 @@ func Test_BackupLogPoller(t *testing.T) { th.Backend.Commit() // commit block 34 with 3 tx's included - b, err := th.Client.BlockByNumber(ctx, nil) + block34, err := th.Client.BlockByNumber(ctx, nil) require.NoError(t, err) - require.Equal(t, uint64(34), b.Number().Uint64()) + require.Equal(t, uint64(34), block34.Number().Uint64()) - // save a receipt for later - receipts := rawdb.ReadReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), uint64(time.Now().Unix()), params.AllEthashProtocolChanges) - txs := b.Body().Transactions + // Ensure that the logs have been included in this rpc server's view of the blockchain + txs := block34.Body().Transactions require.Len(t, txs, 3) receipt, err := th.Client.TransactionReceipt(ctx, txs[0].Hash()) require.NoError(t, err) require.NotZero(t, receipt) + require.Len(t, receipt.Logs, 1) - //// Simulate a situation where the rpc server has a block, but no logs available for it yet - //// this can't happen with geth itself, but can with other clients. - rawdb.WriteReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), types.Receipts{}) // wipes out all logs for block 34 + // Simulate an optimism rpc server, which is behind and still syncing + backupRpc := simulated.NewBackend(types.GenesisAlloc{ + th.Owner.From: { + Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), + }, + }, simulated.WithBlockGasLimit(10e6)) + + primaryRpc := th.Backend // save primaryRpc for later - body := rawdb.ReadBody(th.EthDB, b.Hash(), b.Number().Uint64()) - require.NotNil(t, body) - require.Equal(t, 3, len(body.Transactions)) + // Failover to backup rpc + th.SetActiveClient(backupRpc, true) - body.Transactions = types.Transactions{} // number of tx's must match # of logs for GetLogs() to succeed - rawdb.WriteBody(th.EthDB, b.Hash(), b.Number().Uint64(), body) + // Ensure that the client LogPoller is connected to no longer remembers block 34 + _, err = th.Client.BlockByHash(ctx, block34.Hash()) + require.ErrorIs(t, err, ethereum.NotFound) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) assert.Equal(t, int64(35), currentBlockNumber) - // simulate logs becoming available - rawdb.WriteReceipts(th.EthDB, b.Hash(), b.Number().Uint64(), receipts) - require.True(t, rawdb.HasReceipts(th.EthDB, b.Hash(), b.Number().Uint64())) - body.Transactions = txs - rawdb.WriteBody(th.EthDB, b.Hash(), b.Number().Uint64(), body) - // flush out cached block 34 by reading logs from first 32 blocks - query := ethereum.FilterQuery{ - FromBlock: big.NewInt(int64(2)), - ToBlock: big.NewInt(int64(33)), - Addresses: []common.Address{th.EmitterAddress1}, - Topics: [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, - } - fLogs, err := th.Client.FilterLogs(ctx, query) - require.NoError(t, err) - require.Equal(t, 32, len(fLogs)) + //query := ethereum.FilterQuery{ + // FromBlock: big.NewInt(int64(2)), + // ToBlock: big.NewInt(int64(33)), + // Addresses: []common.Address{th.EmitterAddress1}, + // Topics: [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, + //} + //fLogs, err := th.Client.FilterLogs(ctx, query) + //require.NoError(t, err) + //require.Equal(t, 32, len(fLogs)) // logs shouldn't show up yet logs, err := th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 0, len(logs)) - th.Backend.Commit() - th.Backend.Commit() - //markBlockAsFinalized(t, th, 34) + finalizeThroughBlock(t, th, 34) + + th.SetActiveClient(primaryRpc, true) // restore primary rpc // Run ordinary poller + backup poller at least once currentBlock, _ := th.LogPoller.LatestBlock(ctx) @@ -374,7 +372,7 @@ func Test_BackupLogPoller(t *testing.T) { th.LogPoller.BackupPollAndSaveLogs(ctx) currentBlock, _ = th.LogPoller.LatestBlock(ctx) - require.Equal(t, int64(37), currentBlock.BlockNumber+1) + //require.Equal(t, int64(37), currentBlock.BlockNumber+1) // logs still shouldn't show up, because we don't want to backfill the last finalized log // to help with reorg detection @@ -553,29 +551,30 @@ func TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld(t *testing.T) // Emit some logs in blocks for i := 1; i <= logsBatch; i++ { - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) + _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(0x100 + i))}) require.NoError(t, err) th.Backend.Commit() } // First PollAndSave, no filters are registered, but finalization is the same as the latest block // 1 -> 2 -> ... -> firstBatchBlock - firstBatchBlock := th.PollAndSaveLogs(ctx, 1) - // Mark current tip of the chain as finalized (after emitting 10 logs) + firstBatchBlock := th.PollAndSaveLogs(ctx, 1) - 1 - //markBlockAsFinalized(t, th, firstBatchBlock-1) + // Mark all blocks from first batch of emitted logs as finalized + finalizeThroughBlock(t, th, firstBatchBlock) // Emit 2nd batch of block for i := 1; i <= logsBatch; i++ { - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(100 + i))}) + _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(0x200 + i))}) require.NoError(t, err) th.Backend.Commit() } - // 1 -> 2 -> ... -> firstBatchBlock (finalized) -> .. -> firstBatchBlock + emitted logs - secondBatchBlock := th.PollAndSaveLogs(ctx, firstBatchBlock) - // Mark current tip of the block as finalized (after emitting 20 logs) - //markBlockAsFinalized(t, th, secondBatchBlock-1) + // 1 -> 2 -> ... -> firstBatchBlock (finalized) -> .. -> firstBatchBlock + logsBatch + secondBatchBlock := th.PollAndSaveLogs(ctx, firstBatchBlock) - 1 + + // Mark all blocks from second batch of emitted logs as finalized + finalizeThroughBlock(t, th, secondBatchBlock) // Register filter err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ @@ -589,8 +588,8 @@ func TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld(t *testing.T) th.LogPoller.BackupPollAndSaveLogs(ctx) require.NoError(t, err) - // Only the 2nd batch + 1 log from a previous batch should be backfilled, because we perform backfill starting - // from one block behind the latest finalized block + // Only the 2nd batch should be backfilled, because we perform backfill starting from one + // behind the latest finalized block logs, err := th.LogPoller.Logs( ctx, 0, @@ -600,7 +599,7 @@ func TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld(t *testing.T) ) require.NoError(t, err) require.Len(t, logs, logsBatch) - require.Equal(t, hexutil.MustDecode(`0x000000000000000000000000000000000000000000000000000000000000000a`), logs[0].Data) + require.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000201`), logs[0].Data) // 0x201 = 1st log from 2nd batch } func TestLogPoller_BlockTimestamps(t *testing.T) { @@ -1321,11 +1320,11 @@ func TestLogPoller_GetBlocks_Range(t *testing.T) { _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - th.Client.Commit() // Commit block #2 with log in it + th.Backend.Commit() // Commit block #2 with log in it _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) - th.Client.Commit() // Commit block #3 with a different log + th.Backend.Commit() // Commit block #3 with a different log err = th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ Name: "GetBlocks Test", @@ -1916,6 +1915,22 @@ func Test_PruneOldBlocks(t *testing.T) { } } +// Commits new blocks until blockNumber is finalized. This requires committing until the +// latest block number reaches the next epoch boundary ( where blockNumber % 32 == 0 ) +func finalizeThroughBlock(t *testing.T, th TestHarness, blockNumber int64) { + var currentBlock common.Hash + ctx := testutils.Context(t) + targetBlockNumber := 32 * (blockNumber/32 + 1) + h, err := th.Client.HeaderByNumber(ctx, nil) + require.NoError(t, err) + for n := h.Number.Int64(); n < targetBlockNumber; n++ { + currentBlock = th.Backend.Commit() + require.Len(t, currentBlock, 32) + } + h, err = th.Client.HeaderByNumber(ctx, nil) + require.Equal(t, targetBlockNumber, h.Number.Int64()) +} + func TestFindLCA(t *testing.T) { ctx := testutils.Context(t) ec := evmtest.NewEthClientMockWithDefaultChain(t) From f721d1a5970ff8c0785bde9d51b480aa3e17560c Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 9 May 2024 21:34:56 -0700 Subject: [PATCH 06/30] Fix TestLogPoller_ReorgDeeperThanFinality --- core/chains/evm/logpoller/log_poller_test.go | 74 ++++++++++++-------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 53834d085ed..116bb57adf6 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -926,7 +926,9 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // Create 4 th.Backend.Commit() // Mark block 1 as finalized - //markBlockAsFinalized(t, th, 1) + if tt.finalityTag { + finalizeThroughBlock(t, th, 1) + } newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(5), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) @@ -961,7 +963,9 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // Create 5 th.Backend.Commit() // Mark block 2 as finalized - //markBlockAsFinalized(t, th, 3) + if tt.finalityTag { + finalizeThroughBlock(t, th, 3) + } newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(7), newStart) @@ -991,7 +995,9 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { th.Backend.Commit() } // Mark block 7 as finalized - //markBlockAsFinalized(t, th, 7) + if tt.finalityTag { + finalizeThroughBlock(t, th, 7) + } newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(11), newStart) @@ -1082,51 +1088,50 @@ func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) { require.NoError(t, err) // Test scenario - // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) + // Chain gen <- 1 <- 2 <- ... <- 32 (finalized) <- 33 (L1_1) + finalizeThroughBlock(t, th, 32) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) th.Backend.Commit() - th.Backend.Commit() - th.Backend.Commit() - //markBlockAsFinalized(t, th, 3) // Polling should get us the L1 log. firstPoll := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.Equal(t, int64(5), firstPoll) + assert.Equal(t, int64(34), firstPoll) assert.NoError(t, th.LogPoller.Healthy()) // Fork deeper than finality depth - // Chain gen <- 1 <- 2 <- 3 (finalized) <- 4 (L1_1) - // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) - lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) + // Chain gen <- 1 <- 2 <- 3 <- ... <- 32 (finalized) <- 33 (L1_1) + // \ <- 3' <- ... <- 31' <- 32' (finalized) <- 33' <- 34' (L1_2) + lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(2)) require.NoError(t, err) require.NoError(t, th.Backend.Fork(lca.Hash())) - // Create 2' - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) + // Create 3' + _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) th.Backend.Commit() - // Create 3-10 - for i := 3; i < 10; i++ { + finalizeThroughBlock(t, th, 32) + + // Create 33' - 34' + for i := 33; i < 35; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Backend.Commit() } - //markBlockAsFinalized(t, th, 6) secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll) assert.Equal(t, firstPoll, secondPoll) assert.Equal(t, logpoller.ErrFinalityViolated, th.LogPoller.Healthy()) - // Manually remove latest block from the log poller to bring it back to life + // Manually remove re-org'd chain from the log poller to bring it back to life // LogPoller should be healthy again after first poll - // Chain gen <- 1 - // \ 2' <- 3' <- 4' <- 5' <- 6' (finalized) <- 7' <- 8' <- 9' <- 10' (L1_2) - require.NoError(t, th.ORM.DeleteLogsAndBlocksAfter(testutils.Context(t), 2)) + // Chain gen <- 1 <- 2 + // \ <- 3' <- 4' <- 5' <- 32' (finalized) <- 33' <- 34' (L1_2) + require.NoError(t, th.ORM.DeleteLogsAndBlocksAfter(testutils.Context(t), 3)) // Poll from latest recoveryPoll := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.Equal(t, int64(10), recoveryPoll) + assert.Equal(t, int64(35), recoveryPoll) assert.NoError(t, th.LogPoller.Healthy()) }) } @@ -1732,7 +1737,7 @@ func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { name: "using finality from chain", useFinalityTag: true, finalityDepth: 0, - expectedFinalizedBlock: 1, + expectedFinalizedBlock: 32, }, } for _, tt := range tests { @@ -1754,6 +1759,10 @@ func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { th.Backend.Commit() } + if tt.useFinalityTag { + finalizeThroughBlock(t, th, int64(tt.expectedFinalizedBlock)) + } + th.PollAndSaveLogs(ctx, 1) latestBlock, err := th.LogPoller.LatestBlock(ctx) @@ -1819,10 +1828,13 @@ func Test_CreatedAfterQueriesWithBackfill(t *testing.T) { }) require.NoError(t, err) - // Emit blocks to cover finality depth, because backup always backfill up to the one block before last finalized - for i := 0; i < int(tt.finalityDepth)+1; i++ { - th.Backend.Commit() - //markBlockAsFinalizedByHash(t, th, bh) + // Finalize current block, because backup always backfill up to one block before last finalized + if tt.finalityTag { + finalizeThroughBlock(t, th, currentBlock) + } else { + for i := 0; i < int(tt.finalityDepth)+1; i++ { + th.Backend.Commit() + } } // LogPoller should backfill entire history @@ -1915,12 +1927,16 @@ func Test_PruneOldBlocks(t *testing.T) { } } -// Commits new blocks until blockNumber is finalized. This requires committing until the -// latest block number reaches the next epoch boundary ( where blockNumber % 32 == 0 ) +// Commits new blocks until blockNumber is finalized. This requires committing all of +// the rest of the blocks in the epoch blockNumber belongs to, where each new epoch +// starts on a 32-block boundary (blockNumber % 32 == 0) func finalizeThroughBlock(t *testing.T, th TestHarness, blockNumber int64) { var currentBlock common.Hash ctx := testutils.Context(t) - targetBlockNumber := 32 * (blockNumber/32 + 1) + targetBlockNumber := blockNumber + if targetBlockNumber%32 != 0 { + targetBlockNumber = 32 * (blockNumber/32 + 1) + } h, err := th.Client.HeaderByNumber(ctx, nil) require.NoError(t, err) for n := h.Number.Int64(); n < targetBlockNumber; n++ { From 564373224625af19e7ce53616f3937c4a39bca71 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 9 May 2024 21:47:52 -0700 Subject: [PATCH 07/30] Fix Test_PollAndSavePersistsFinalityInBlocks --- core/chains/evm/logpoller/log_poller_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 116bb57adf6..50135b93f24 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -1713,7 +1713,7 @@ func Test_PollAndQueryFinalizedBlocks(t *testing.T) { func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { ctx := testutils.Context(t) - numberOfBlocks := 10 + numberOfBlocks := 37 // must be greater than 1 epoch tests := []struct { name string @@ -1730,7 +1730,7 @@ func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { { name: "setting last finalized block number to 0 if finality is too deep", useFinalityTag: false, - finalityDepth: 20, + finalityDepth: 40, expectedFinalizedBlock: 0, }, { @@ -1944,7 +1944,7 @@ func finalizeThroughBlock(t *testing.T, th TestHarness, blockNumber int64) { require.Len(t, currentBlock, 32) } h, err = th.Client.HeaderByNumber(ctx, nil) - require.Equal(t, targetBlockNumber, h.Number.Int64()) + require.GreaterOrEqual(t, h.Number.Int64(), targetBlockNumber) } func TestFindLCA(t *testing.T) { From 82787a9984385e6bbd1758912f9cbe54a1211da7 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 9 May 2024 21:56:06 -0700 Subject: [PATCH 08/30] Fix Test_PollAndQueryFinalizedBlocks --- core/chains/evm/logpoller/log_poller_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 50135b93f24..91bcc4110d3 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -1675,7 +1675,7 @@ func Test_PollAndQueryFinalizedBlocks(t *testing.T) { h, err := th.Client.HeaderByNumber(ctx, nil) require.NoError(t, err) assert.NotNil(t, h) - // th.Client.Blockchain().SetFinalized(h) + finalizeThroughBlock(t, th, h.Number.Int64()) // Generate next blocks, not marked as finalized for i := 0; i < secondBatchLen; i++ { @@ -1685,7 +1685,7 @@ func Test_PollAndQueryFinalizedBlocks(t *testing.T) { } currentBlock := th.PollAndSaveLogs(ctx, 1) - require.Equal(t, int(currentBlock), firstBatchLen+secondBatchLen+2) + require.Equal(t, 32+secondBatchLen+1, int(currentBlock)) finalizedLogs, err := th.LogPoller.LogsDataWordGreaterThan( ctx, From 5bd01996f61180592aa614b6c9fb671cb230655a Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Sun, 12 May 2024 19:07:33 -0700 Subject: [PATCH 09/30] update listener_v2_log_listener_test --- .../vrf/v2/listener_v2_log_listener_test.go | 93 ++++++++++--------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/core/services/vrf/v2/listener_v2_log_listener_test.go b/core/services/vrf/v2/listener_v2_log_listener_test.go index 5c7ae20ac67..7ac820b25a5 100644 --- a/core/services/vrf/v2/listener_v2_log_listener_test.go +++ b/core/services/vrf/v2/listener_v2_log_listener_test.go @@ -13,6 +13,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/jmoiron/sqlx" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" @@ -45,7 +47,7 @@ type vrfLogPollerListenerTH struct { ChainID *big.Int ORM logpoller.ORM LogPoller logpoller.LogPollerTest - Client *backends.SimulatedBackend + Backend *simulated.Backend Emitter *log_emitter.LogEmitter EmitterAddress common.Address VRFLogEmitter *vrf_log_emitter.VRFLogEmitter @@ -69,11 +71,12 @@ func setupVRFLogPollerListenerTH(t *testing.T, o := logpoller.NewORM(chainID, db, lggr) owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + backend := simulated.NewBackend(ethtypes.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)) + ec := backend.Client() // VRF Listener relies on block timestamps, but SimulatedBackend uses by default clock starting from 1970-01-01 // This trick is used to move the clock closer to the current time. We set first block to be X hours ago. // FirstBlockAge is used to compute first block's timestamp in SimulatedBackend (time.Now() - FirstBlockAge) @@ -81,11 +84,11 @@ func setupVRFLogPollerListenerTH(t *testing.T, h, err := ec.HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) blockTime := time.UnixMilli(int64(h.Time)) - err = ec.AdjustTime(time.Since(blockTime) - FirstBlockAge) + err = backend.AdjustTime(time.Since(blockTime) - FirstBlockAge) require.NoError(t, err) - ec.Commit() + backend.Commit() - esc := client.NewSimulatedBackendClient(t, ec, chainID) + esc := client.NewSimulatedBackendClient(t, backend, chainID) // Mark genesis block as finalized to avoid any nulls in the tests //TODO must we do this? //h, err := ec.HeaderByNumber(ctx, nil) @@ -109,7 +112,7 @@ func setupVRFLogPollerListenerTH(t *testing.T, require.NoError(t, err) vrfLogEmitterAddress, _, vrfLogEmitter, err := vrf_log_emitter.DeployVRFLogEmitter(owner, ec) require.NoError(t, err) - ec.Commit() + backend.Commit() // Log Poller Listener ks := keystore.NewInMemory(db, utils.FastScryptParams, lggr) @@ -168,7 +171,7 @@ func setupVRFLogPollerListenerTH(t *testing.T, EmitterAddress: emitterAddress1, VRFLogEmitter: vrfLogEmitter, VRFEmitterAddress: vrfLogEmitterAddress, - Client: ec, + Backend: backend, Owner: owner, Db: db, Listener: listener, @@ -197,7 +200,7 @@ func TestInitProcessedBlock_NoVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Emit some logs from block 5 to 9 (Inclusive) @@ -207,7 +210,7 @@ func TestInitProcessedBlock_NoVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 5 (EmitLog blocks) = 9 @@ -270,7 +273,7 @@ func TestInitProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Create VRF request block and a fulfillment block @@ -281,10 +284,10 @@ func TestInitProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() _, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID, preSeed, big.NewInt(10), true) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock n := 5 @@ -293,7 +296,7 @@ func TestInitProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. @@ -327,7 +330,7 @@ func TestInitProcessedBlock_OneUnfulfilledVRFReq(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Make a VRF request without fulfilling it @@ -338,17 +341,17 @@ func TestInitProcessedBlock_OneUnfulfilledVRFReq(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock n := 5 - th.Client.Commit() + th.Backend.Commit() for i := 0; i < n; i++ { _, err1 := th.Emitter.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. @@ -381,7 +384,7 @@ func TestInitProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Emit some logs in blocks with VRF reqs interspersed @@ -392,7 +395,7 @@ func TestInitProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() // Create 2 blocks with VRF requests in each iteration keyHash := [32]byte(th.Listener.job.VRFSpec.PublicKey.MustHash().Bytes()) @@ -402,13 +405,13 @@ func TestInitProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() reqID2 := big.NewInt(int64(2*i + 1)) _, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. @@ -443,7 +446,7 @@ func TestInitProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Emit some logs in blocks with VRF reqs interspersed @@ -454,7 +457,7 @@ func TestInitProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() // Create 2 blocks with VRF requests in each iteration and fulfill one // of them. This creates a mixed workload of fulfilled and unfulfilled @@ -466,7 +469,7 @@ func TestInitProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() reqID2 := big.NewInt(int64(2*i + 1)) _, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, @@ -475,7 +478,7 @@ func TestInitProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { _, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. @@ -518,7 +521,7 @@ func TestUpdateLastProcessedBlock_NoVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Create VRF request logs @@ -530,13 +533,13 @@ func TestUpdateLastProcessedBlock_NoVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() reqID2 := big.NewInt(int64(2)) _, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock n := 5 @@ -545,7 +548,7 @@ func TestUpdateLastProcessedBlock_NoVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 2 (VRF req blocks) + 5 (EmitLog blocks) = 11 @@ -575,7 +578,7 @@ func TestUpdateLastProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Create VRF request log block with a fulfillment log block @@ -587,11 +590,11 @@ func TestUpdateLastProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() _, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock n := 5 @@ -600,7 +603,7 @@ func TestUpdateLastProcessedBlock_NoUnfulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 2 (VRF req/resp blocks) + 5 (EmitLog blocks) = 11 @@ -630,7 +633,7 @@ func TestUpdateLastProcessedBlock_OneUnfulfilledVRFReq(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Create VRF request logs without a fulfillment log block @@ -642,7 +645,7 @@ func TestUpdateLastProcessedBlock_OneUnfulfilledVRFReq(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock n := 5 @@ -651,7 +654,7 @@ func TestUpdateLastProcessedBlock_OneUnfulfilledVRFReq(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 1 (VRF req block) + 5 (EmitLog blocks) = 10 @@ -681,7 +684,7 @@ func TestUpdateLastProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock @@ -691,7 +694,7 @@ func TestUpdateLastProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() // Create 2 blocks with VRF requests in each iteration keyHash := [32]byte(th.Listener.job.VRFSpec.PublicKey.MustHash().Bytes()) @@ -702,13 +705,13 @@ func TestUpdateLastProcessedBlock_SomeUnfulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() reqID2 := big.NewInt(int64(2*i + 1)) _, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID2, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 3*5 (EmitLog + VRF req blocks) = 19 @@ -738,7 +741,7 @@ func TestUpdateLastProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { // Block 3 to finalityDepth. Ensure we have finality number of blocks for i := 1; i < int(finalityDepth); i++ { - th.Client.Commit() + th.Backend.Commit() } // Emit some logs in blocks to make the VRF req and fulfillment older than finalityDepth from latestBlock @@ -748,7 +751,7 @@ func TestUpdateLastProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { require.NoError(t, err1) _, err1 = th.Emitter.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err1) - th.Client.Commit() + th.Backend.Commit() // Create 2 blocks with VRF requests in each iteration and fulfill one // of them. This creates a mixed workload of fulfilled and unfulfilled @@ -761,7 +764,7 @@ func TestUpdateLastProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { _, err2 := th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, keyHash, reqID1, preSeed, subID, 10, 10000, 2, th.Owner.From) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() reqID2 := big.NewInt(int64(2*i + 1)) _, err2 = th.VRFLogEmitter.EmitRandomWordsRequested(th.Owner, @@ -769,7 +772,7 @@ func TestUpdateLastProcessedBlock_UnfulfilledNFulfilledVRFReqs(t *testing.T) { require.NoError(t, err2) _, err2 = th.VRFLogEmitter.EmitRandomWordsFulfilled(th.Owner, reqID1, preSeed, big.NewInt(10), true) require.NoError(t, err2) - th.Client.Commit() + th.Backend.Commit() } // Blocks till now: 2 (in SetupTH) + 2 (empty blocks) + 3*5 (EmitLog + VRF req blocks) = 19 From 81aa9b735eac3df9d4b7064d8495b616719c2260 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Sun, 12 May 2024 18:41:09 -0700 Subject: [PATCH 10/30] Fix chainreader & config poller tests --- .../evm/client/simulated_backend_client.go | 2 +- core/chains/evm/logpoller/helper_test.go | 2 -- core/chains/evm/logpoller/log_poller_test.go | 7 +++-- core/services/relay/evm/chain_reader_test.go | 25 ++++++++-------- core/services/relay/evm/config_poller_test.go | 29 ++++++++++--------- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index b736a6e649c..7ff4f0ec6ac 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -481,7 +481,7 @@ func (c *SimulatedBackendClient) EstimateGas(ctx context.Context, call ethereum. // SuggestGasPrice recommends a gas price. func (c *SimulatedBackendClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - panic("unimplemented") + return c.client.SuggestGasPrice(ctx) } // BatchCallContext makes a batch rpc call. diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index e5fc1404836..6da7d20dcdb 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -49,8 +49,6 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { chainID := testutils.NewRandomEVMChainID() chainID2 := testutils.NewRandomEVMChainID() db := pgtest.NewSqlxDB(t) - //dataDir, err := os.MkdirTemp("", "simgethdata") - //require.NoError(t, err) o := logpoller.NewORM(chainID, db, lggr) o2 := logpoller.NewORM(chainID2, db, lggr) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 91bcc4110d3..395ecfc646b 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -344,7 +344,7 @@ func Test_BackupLogPoller(t *testing.T) { require.ErrorIs(t, err, ethereum.NotFound) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) - assert.Equal(t, int64(35), currentBlockNumber) + assert.Equal(t, int64(1), currentBlockNumber) // flush out cached block 34 by reading logs from first 32 blocks //query := ethereum.FilterQuery{ @@ -380,7 +380,7 @@ func Test_BackupLogPoller(t *testing.T) { require.NoError(t, err) assert.Equal(t, 0, len(logs)) th.Backend.Commit() - //markBlockAsFinalized(t, th, 35) + finalizeThroughBlock(t, th, 35) // Run ordinary poller + backup poller at least once more th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1) @@ -1760,7 +1760,7 @@ func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { } if tt.useFinalityTag { - finalizeThroughBlock(t, th, int64(tt.expectedFinalizedBlock)) + finalizeThroughBlock(t, th, tt.expectedFinalizedBlock) } th.PollAndSaveLogs(ctx, 1) @@ -1944,6 +1944,7 @@ func finalizeThroughBlock(t *testing.T, th TestHarness, blockNumber int64) { require.Len(t, currentBlock, 32) } h, err = th.Client.HeaderByNumber(ctx, nil) + require.NoError(t, err) require.GreaterOrEqual(t, h.Number.Int64(), targetBlockNumber) } diff --git a/core/services/relay/evm/chain_reader_test.go b/core/services/relay/evm/chain_reader_test.go index c3cb36b93e3..c81cafebf3c 100644 --- a/core/services/relay/evm/chain_reader_test.go +++ b/core/services/relay/evm/chain_reader_test.go @@ -13,12 +13,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" evmtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/smartcontractkit/libocr/commontypes" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -63,7 +62,7 @@ func TestChainReaderGetLatestValue(t *testing.T) { anyString := "foo" tx, err := it.evmTest.TriggerEventWithDynamicTopic(it.auth, anyString) require.NoError(t, err) - it.sim.Commit() + it.backend.Commit() it.incNonce() it.awaitTx(t, tx) @@ -113,7 +112,7 @@ func triggerFourTopics(t *testing.T, it *chainReaderInterfaceTester, i1, i2, i3 tx, err := it.evmTest.ChainReaderTesterTransactor.TriggerWithFourTopics(it.auth, i1, i2, i3) require.NoError(t, err) require.NoError(t, err) - it.sim.Commit() + it.backend.Commit() it.incNonce() it.awaitTx(t, tx) } @@ -124,7 +123,7 @@ type chainReaderInterfaceTester struct { address2 string chainConfig types.ChainReaderConfig auth *bind.TransactOpts - sim *backends.SimulatedBackend + backend *simulated.Backend pk *ecdsa.PrivateKey evmTest *chain_reader_tester.ChainReaderTester cr evm.ChainReaderService @@ -238,7 +237,7 @@ func (it *chainReaderInterfaceTester) Setup(t *testing.T) { }, }, } - it.client = client.NewSimulatedBackendClient(t, it.sim, big.NewInt(1337)) + it.client = client.NewSimulatedBackendClient(t, it.backend, big.NewInt(1337)) it.deployNewContracts(t) } @@ -308,7 +307,7 @@ func (it *chainReaderInterfaceTester) sendTxWithTestStruct(t *testing.T, testStr midToInternalType(testStruct.NestedStruct), ) require.NoError(t, err) - it.sim.Commit() + it.backend.Commit() it.incNonce() it.awaitTx(t, tx) } @@ -337,8 +336,8 @@ func (it *chainReaderInterfaceTester) setupChainNoClient(t require.TestingT) { it.auth, err = bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(1337)) require.NoError(t, err) - it.sim = backends.NewSimulatedBackend(core.GenesisAlloc{it.auth.From: {Balance: big.NewInt(math.MaxInt64)}}, commonGasLimitOnEvms*5000) - it.sim.Commit() + it.backend = simulated.NewBackend(evmtypes.GenesisAlloc{it.auth.From: {Balance: big.NewInt(math.MaxInt64)}}, simulated.WithBlockGasLimit(commonGasLimitOnEvms*5000)) + it.backend.Commit() } func (it *chainReaderInterfaceTester) deployNewContracts(t *testing.T) { @@ -348,7 +347,7 @@ func (it *chainReaderInterfaceTester) deployNewContracts(t *testing.T) { func (it *chainReaderInterfaceTester) deployNewContract(t *testing.T) string { ctx := testutils.Context(t) - gasPrice, err := it.sim.SuggestGasPrice(ctx) + gasPrice, err := it.client.SuggestGasPrice(ctx) require.NoError(t, err) it.auth.GasPrice = gasPrice @@ -356,10 +355,10 @@ func (it *chainReaderInterfaceTester) deployNewContract(t *testing.T) string { // Not sure if there's a better way to get it. it.auth.GasLimit = 10552800 - address, tx, ts, err := chain_reader_tester.DeployChainReaderTester(it.auth, it.sim) + address, tx, ts, err := chain_reader_tester.DeployChainReaderTester(it.auth, it.client) require.NoError(t, err) - it.sim.Commit() + it.backend.Commit() if it.evmTest == nil { it.evmTest = ts } @@ -370,7 +369,7 @@ func (it *chainReaderInterfaceTester) deployNewContract(t *testing.T) string { func (it *chainReaderInterfaceTester) awaitTx(t *testing.T, tx *evmtypes.Transaction) { ctx := testutils.Context(t) - receipt, err := it.sim.TransactionReceipt(ctx, tx.Hash()) + receipt, err := it.client.TransactionReceipt(ctx, tx.Hash()) require.NoError(t, err) require.Equal(t, evmtypes.ReceiptStatusSuccessful, receipt.Status) } diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go index 8c02c4e2e7e..7931bfaa5d9 100644 --- a/core/services/relay/evm/config_poller_test.go +++ b/core/services/relay/evm/config_poller_test.go @@ -8,11 +8,11 @@ import ( "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" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/onsi/gomega" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -52,7 +52,8 @@ func TestConfigPoller(t *testing.T) { var configStoreContractAddr common.Address var configStoreContract *ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimple var user *bind.TransactOpts - var b *backends.SimulatedBackend + var b *simulated.Backend + var ec simulated.Client var linkTokenAddress common.Address var accessAddress common.Address ctx := testutils.Context(t) @@ -64,16 +65,18 @@ func TestConfigPoller(t *testing.T) { require.NoError(t, err) user, err = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) - b = backends.NewSimulatedBackend(core.GenesisAlloc{ + b = simulated.NewBackend(types.GenesisAlloc{ user.From: {Balance: big.NewInt(1000000000000000000)}}, - 5*ethconfig.Defaults.Miner.GasCeil) - linkTokenAddress, _, _, err = link_token_interface.DeployLinkToken(user, b) + simulated.WithBlockGasLimit(5*ethconfig.Defaults.Miner.GasCeil)) + require.NotNil(t, b) + ec = b.Client() + linkTokenAddress, _, _, err = link_token_interface.DeployLinkToken(user, ec) require.NoError(t, err) - accessAddress, _, _, err = testoffchainaggregator2.DeploySimpleWriteAccessController(user, b) + accessAddress, _, _, err = testoffchainaggregator2.DeploySimpleWriteAccessController(user, ec) require.NoError(t, err, "failed to deploy test access controller contract") ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, - b, + ec, linkTokenAddress, big.NewInt(0), big.NewInt(10), @@ -83,7 +86,7 @@ func TestConfigPoller(t *testing.T) { "TEST", ) require.NoError(t, err) - configStoreContractAddr, _, configStoreContract, err = ocrconfigurationstoreevmsimple.DeployOCRConfigurationStoreEVMSimple(user, b) + configStoreContractAddr, _, configStoreContract, err = ocrconfigurationstoreevmsimple.DeployOCRConfigurationStoreEVMSimple(user, ec) require.NoError(t, err) b.Commit() @@ -133,7 +136,7 @@ func TestConfigPoller(t *testing.T) { DeltaC: 10, }, ocrContract, user) b.Commit() - latest, err := b.BlockByNumber(testutils.Context(t), nil) + latest, err := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) // Ensure we capture this config set log. require.NoError(t, lp.Replay(testutils.Context(t), latest.Number().Int64()-1)) @@ -164,7 +167,7 @@ func TestConfigPoller(t *testing.T) { var err error ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, - b, + ec, linkTokenAddress, big.NewInt(0), big.NewInt(10), @@ -207,7 +210,7 @@ func TestConfigPoller(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(testutils.Context(t)) require.NoError(t, err) - latest, err := b.BlockByNumber(testutils.Context(t), nil) + latest, err := ec.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) onchainDetails, err := ocrContract.LatestConfigDetails(nil) @@ -239,7 +242,7 @@ func TestConfigPoller(t *testing.T) { // deploy it again to reset to empty config ocrAddress, _, ocrContract, err = ocr2aggregator.DeployOCR2Aggregator( user, - b, + ec, linkTokenAddress, big.NewInt(0), big.NewInt(10), From d31bfda0f86bcc0bd814f5ff5fc9da282c9fed1c Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 14 May 2024 21:04:52 -0700 Subject: [PATCH 11/30] Update keeper integration tests --- core/internal/cltest/simulated_backend.go | 22 +++++++++++----------- core/services/keeper/integration_test.go | 3 ++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/internal/cltest/simulated_backend.go b/core/internal/cltest/simulated_backend.go index b3714208547..3637adbd2dc 100644 --- a/core/internal/cltest/simulated_backend.go +++ b/core/internal/cltest/simulated_backend.go @@ -5,8 +5,8 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" @@ -17,8 +17,8 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" ) -func NewSimulatedBackend(t *testing.T, alloc core.GenesisAlloc, gasLimit uint32) *backends.SimulatedBackend { - backend := backends.NewSimulatedBackend(alloc, uint64(gasLimit)) +func NewSimulatedBackend(t *testing.T, alloc types.GenesisAlloc, gasLimit uint32) *simulated.Backend { + backend := simulated.NewBackend(alloc, simulated.WithBlockGasLimit(uint64(gasLimit))) // NOTE: Make sure to finish closing any application/client before // backend.Close or they can hang t.Cleanup(func() { @@ -29,10 +29,10 @@ func NewSimulatedBackend(t *testing.T, alloc core.GenesisAlloc, gasLimit uint32) func NewApplicationWithConfigV2OnSimulatedBlockchain( t testing.TB, cfg chainlink.GeneralConfig, - backend *backends.SimulatedBackend, + backend *simulated.Backend, flagsAndDeps ...interface{}, ) *TestApplication { - bid, err := backend.ChainID(testutils.Context(t)) + bid, err := backend.Client().ChainID(testutils.Context(t)) require.NoError(t, err) if bid.Cmp(testutils.SimulatedChainID) != 0 { t.Fatalf("expected backend chain ID to be %s but it was %s", testutils.SimulatedChainID.String(), bid.String()) @@ -40,7 +40,7 @@ func NewApplicationWithConfigV2OnSimulatedBlockchain( require.Zero(t, evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()).Cmp(testutils.SimulatedChainID)) chainID := big.New(testutils.SimulatedChainID) - client := client.NewSimulatedBackendClient(t, backend.Backend, testutils.SimulatedChainID) + client := client.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID) flagsAndDeps = append(flagsAndDeps, client, chainID) @@ -55,10 +55,10 @@ func NewApplicationWithConfigV2OnSimulatedBlockchain( func NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain( t testing.TB, cfg chainlink.GeneralConfig, - backend *backends.SimulatedBackend, + backend *simulated.Backend, flagsAndDeps ...interface{}, ) *TestApplication { - bid, err := backend.ChainID(testutils.Context(t)) + bid, err := backend.Client().ChainID(testutils.Context(t)) require.NoError(t, err) if bid.Cmp(testutils.SimulatedChainID) != 0 { t.Fatalf("expected backend chain ID to be %s but it was %s", testutils.SimulatedChainID.String(), bid.String()) @@ -66,7 +66,7 @@ func NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain( require.Zero(t, evmtest.MustGetDefaultChainID(t, cfg.EVMConfigs()).Cmp(testutils.SimulatedChainID)) chainID := big.New(testutils.SimulatedChainID) - client := client.NewSimulatedBackendClient(t, backend.Backend, testutils.SimulatedChainID) + client := client.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID) flagsAndDeps = append(flagsAndDeps, client, chainID) @@ -75,7 +75,7 @@ func NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain( } // Mine forces the simulated backend to produce a new block every X seconds -func Mine(backend *backends.SimulatedBackend, blockTime time.Duration) (stopMining func()) { +func Mine(backend *simulated.Backend, blockTime time.Duration) (stopMining func()) { timer := time.NewTicker(blockTime) chStop := make(chan struct{}) wg := sync.WaitGroup{} diff --git a/core/services/keeper/integration_test.go b/core/services/keeper/integration_test.go index 9e4cf5f9041..dc68d896649 100644 --- a/core/services/keeper/integration_test.go +++ b/core/services/keeper/integration_test.go @@ -17,6 +17,7 @@ import ( "github.com/stretchr/testify/require" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" @@ -189,7 +190,7 @@ func TestKeeperEthIntegration(t *testing.T) { carrol := testutils.MustNewSimTransactor(t) // client nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, From 459aa1d73811eebb78172a7c3cdfe1d0c5e1c2e2 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 14 May 2024 21:08:11 -0700 Subject: [PATCH 12/30] Re-run make generate --- .../generated-wrapper-dependency-versions-do-not-edit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 8a3ad8cb2fd..103c137fdb9 100644 --- a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.14 -channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin 4ae3e6ca866fdf48850d67c0c7a4bdaf4905c81a4e3ce5efb9ef9613a55d8454 +channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin c90e29d9f1a885098982b6175e0447416431b28c605273c807694ac7141e9167 channel_config_verifier_proxy: ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.abi ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.bin 655658e5f61dfadfe3268de04f948b7e690ad03ca45676e645d6cd6018154661 channel_verifier: ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin e6020553bd8e3e6b250fcaffe7efd22aea955c8c1a0eb05d282fdeb0ab6550b7 errored_verifier: ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.bin a3e5a77262e13ee30fe8d35551b32a3452d71929e43fd780bbfefeaf4aa62e43 From aec7ffe804fa54bacb3e44917d150885ec3e39e8 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Wed, 22 May 2024 10:01:06 -0700 Subject: [PATCH 13/30] Update BackupLogPoller test Add RegisterHeadNumberCallback() to SimulatedBackendClient, so we can trigger an rpc failover event just after reading a particular block, but before the logs get read for that block. This is the race condition that can happen on optimism chain which BackupPoller was designed to address --- 2 | 7 + .../evm/client/simulated_backend_client.go | 27 +++- core/chains/evm/logpoller/helper_test.go | 5 +- core/chains/evm/logpoller/log_poller.go | 1 + core/chains/evm/logpoller/log_poller_test.go | 133 +++++++++++------- core/chains/evm/types/types.go | 14 ++ 6 files changed, 128 insertions(+), 59 deletions(-) create mode 100644 2 diff --git a/2 b/2 new file mode 100644 index 00000000000..be07b572723 --- /dev/null +++ b/2 @@ -0,0 +1,7 @@ +SELECT FROM ( + SELECT id, block_number, block_hash, log_index + FROM evm.log_poller_filters f JOIN evm.logs l ON + f.evm_chain_id = l.evm_chain_id AND f.address = l.address AND f.event = l.event_sig + WHERE f.evm_chain_id=5 + GROUP BY f.id, l.block_number, l.block_hash, l.log_index +) x order by block_number, log_index; diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index 7ff4f0ec6ac..7ba2c045ce8 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -66,11 +66,12 @@ var ( // SimulatedBackendClient is an Client implementation using a simulated // blockchain backend. Note that not all RPC methods are implemented here. type SimulatedBackendClient struct { - b *simulated.Backend - client simulated.Client - t testing.TB - chainId *big.Int - optimismMode bool + b evmtypes.Backend // *simulated.Backend, or something satisfying same interface + client simulated.Client + t testing.TB + chainId *big.Int + optimismMode bool + headByNumberCallback func(ctx context.Context, c *SimulatedBackendClient, n *big.Int) error } // NewSimulatedBackendClient creates an eth client backed by a simulated backend. @@ -88,7 +89,7 @@ func NewSimulatedBackendClient(t testing.TB, b *simulated.Backend, chainId *big. // where success rather than an error code is returned when a call to FilterLogs() fails to find the block hash // requested. This combined with a failover event can lead to the "eventual consistency" behavior that Backup LogPoller // and other solutions were designed to recover from. -func (c *SimulatedBackendClient) SetBackend(backend *simulated.Backend, optimismMode bool) { +func (c *SimulatedBackendClient) SetBackend(backend evmtypes.Backend, optimismMode bool) { c.optimismMode = optimismMode c.b = backend c.client = backend.Client() @@ -229,6 +230,10 @@ func (c *SimulatedBackendClient) blockNumber(ctx context.Context, number interfa } } +func (c *SimulatedBackendClient) RegisterHeadByNumberCallback(cb func(ctx context.Context, c *SimulatedBackendClient, n *big.Int) error) { + c.headByNumberCallback = cb +} + // HeadByNumber returns our own header type. func (c *SimulatedBackendClient) HeadByNumber(ctx context.Context, n *big.Int) (*evmtypes.Head, error) { if n == nil { @@ -240,6 +245,14 @@ func (c *SimulatedBackendClient) HeadByNumber(ctx context.Context, n *big.Int) ( } else if header == nil { return nil, ethereum.NotFound } + + if c.headByNumberCallback != nil { + err = c.headByNumberCallback(ctx, c, n) + if err != nil { + return nil, err + } + } + return &evmtypes.Head{ EVMChainID: ubig.NewI(c.chainId.Int64()), Hash: header.Hash(), @@ -530,7 +543,7 @@ func (c *SimulatedBackendClient) SuggestGasTipCap(ctx context.Context) (tipCap * return c.client.SuggestGasTipCap(ctx) } -func (c *SimulatedBackendClient) Backend() *simulated.Backend { +func (c *SimulatedBackendClient) Backend() evmtypes.Backend { return c.b } diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index 6da7d20dcdb..652ddf65dd1 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -22,6 +22,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_emitter" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -38,7 +39,7 @@ type TestHarness struct { ORM, ORM2 logpoller.ORM LogPoller logpoller.LogPollerTest Client *client.SimulatedBackendClient - Backend *simulated.Backend + Backend evmtypes.Backend Owner *bind.TransactOpts Emitter1, Emitter2 *log_emitter.LogEmitter EmitterAddress1, EmitterAddress2 common.Address @@ -117,7 +118,7 @@ func (th *TestHarness) assertHaveCanonical(t *testing.T, start, end int) { // Simulates an RPC failover event to an alternate rpc server. This can also be used to // simulate switching back to the primary rpc after it recovers. -func (th *TestHarness) SetActiveClient(backend *simulated.Backend, optimismMode bool) { +func (th *TestHarness) SetActiveClient(backend evmtypes.Backend, optimismMode bool) { th.Backend = backend th.Client.SetBackend(backend, optimismMode) } diff --git a/core/chains/evm/logpoller/log_poller.go b/core/chains/evm/logpoller/log_poller.go index b1d7d1da623..19115cd75f0 100644 --- a/core/chains/evm/logpoller/log_poller.go +++ b/core/chains/evm/logpoller/log_poller.go @@ -27,6 +27,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-common/pkg/utils/mathutil" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 395ecfc646b..fd808a50424 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -12,7 +12,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/leanovate/gopter" @@ -224,6 +223,49 @@ func TestLogPoller_Integration(t *testing.T) { assert.ErrorIs(t, th.LogPoller.Replay(ctx, 4), logpoller.ErrReplayRequestAborted) } +type backendWrapper struct { + b *simulated.Backend +} + +func (b backendWrapper) Client() simulated.Client { + return b.b.Client() +} + +func (b backendWrapper) Close() error { + return b.b.Close() +} + +func (b backendWrapper) Commit() common.Hash { + return b.b.Commit() +} + +func (b backendWrapper) Rollback() { + b.b.Rollback() +} + +func (b backendWrapper) Fork(parentHash common.Hash) error { + return b.b.Fork(parentHash) +} + +func (b backendWrapper) AdjustTime(adjustment time.Duration) error { + return b.b.AdjustTime(adjustment) +} + +// Behaves as primary simulated.Client until failoverBlockNumber is requested (via HeaderByNumber), then +// fails over to secondary simulated.Client. +type failoverClient struct { + primary simulated.Client + secondary simulated.Client + failoverBlockNumber *big.Int +} + +func (f failoverClient) HeaderByNumber(ctx context.Context, n *big.Int) (*types.Header, error) { + if n.Cmp(f.failoverBlockNumber) < 0 { + return f.primary.HeaderByNumber(ctx, n) + } + return f.secondary.HeaderByNumber(ctx, n) +} + // Simulate an rpc failover event on optimism, where logs are requested from a block hash which doesn't // exist on the new rpc server, but a successful error code is returned. This is bad/buggy behavior on the // part of the rpc server, but we should be able to handle this without missing any logs, as @@ -258,15 +300,6 @@ func Test_BackupLogPoller(t *testing.T) { BackupPollerBlockDelay: 100, }, ) - // later, we will need at least 32 blocks filled with logs for cache invalidation - for i := int64(0); i < 32; i++ { - // to invalidate geth's internal read-cache, a matching log must be found in the bloom Filter - // for each of the 32 blocks - tx, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(i + 7)}) - require.NoError(t, err) - require.NotNil(t, tx) - th.Backend.Commit() - } ctx := testutils.Context(t) @@ -300,6 +333,11 @@ func Test_BackupLogPoller(t *testing.T) { assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter2")) }() + for n := 1; n < 31; n++ { + h := th.Backend.Commit() + require.Len(t, h, 32) + } + // generate some tx's with logs tx1, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) @@ -313,14 +351,14 @@ func Test_BackupLogPoller(t *testing.T) { require.NoError(t, err) require.NotNil(t, tx3) - th.Backend.Commit() // commit block 34 with 3 tx's included + th.Backend.Commit() // commit block 32 with 3 tx's included - block34, err := th.Client.BlockByNumber(ctx, nil) + block32, err := th.Client.BlockByNumber(ctx, nil) require.NoError(t, err) - require.Equal(t, uint64(34), block34.Number().Uint64()) + require.Equal(t, uint64(32), block32.Number().Uint64()) // Ensure that the logs have been included in this rpc server's view of the blockchain - txs := block34.Body().Transactions + txs := block32.Body().Transactions require.Len(t, txs, 3) receipt, err := th.Client.TransactionReceipt(ctx, txs[0].Hash()) require.NoError(t, err) @@ -336,64 +374,59 @@ func Test_BackupLogPoller(t *testing.T) { primaryRpc := th.Backend // save primaryRpc for later - // Failover to backup rpc - th.SetActiveClient(backupRpc, true) - - // Ensure that the client LogPoller is connected to no longer remembers block 34 - _, err = th.Client.BlockByHash(ctx, block34.Hash()) - require.ErrorIs(t, err, ethereum.NotFound) + // Failover to simulated optimism rpc on block 30 + th.Client.RegisterHeadByNumberCallback(func(ctx context.Context, c *client.SimulatedBackendClient, n *big.Int) error { + if n.Int64() != 32 { + return nil + } + th.SetActiveClient(backupRpc, true) + return nil + }) currentBlockNumber := th.PollAndSaveLogs(ctx, 1) - assert.Equal(t, int64(1), currentBlockNumber) - - // flush out cached block 34 by reading logs from first 32 blocks - //query := ethereum.FilterQuery{ - // FromBlock: big.NewInt(int64(2)), - // ToBlock: big.NewInt(int64(33)), - // Addresses: []common.Address{th.EmitterAddress1}, - // Topics: [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, - //} - //fLogs, err := th.Client.FilterLogs(ctx, query) - //require.NoError(t, err) - //require.Equal(t, 32, len(fLogs)) + require.Equal(t, int64(33), currentBlockNumber) // logs shouldn't show up yet - logs, err := th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) + logs, err := th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) - assert.Equal(t, 0, len(logs)) + require.Equal(t, 0, len(logs)) - finalizeThroughBlock(t, th, 34) + finalizeThroughBlock(t, th, 32) - th.SetActiveClient(primaryRpc, true) // restore primary rpc + b, ok := primaryRpc.(*simulated.Backend) + require.True(t, ok) + th.SetActiveClient(backendWrapper{b}, true) // restore primary rpc // Run ordinary poller + backup poller at least once - currentBlock, _ := th.LogPoller.LatestBlock(ctx) - th.LogPoller.PollAndSaveLogs(ctx, currentBlock.BlockNumber+1) + require.NoError(t, err) + currentBlockNumber = th.PollAndSaveLogs(ctx, currentBlockNumber) + require.Equal(t, int64(33), currentBlockNumber) th.LogPoller.BackupPollAndSaveLogs(ctx) - currentBlock, _ = th.LogPoller.LatestBlock(ctx) - - //require.Equal(t, int64(37), currentBlock.BlockNumber+1) + latestBlock, err := th.LogPoller.LatestBlock(ctx) + require.NoError(t, err) + require.Equal(t, currentBlockNumber-1, latestBlock.BlockNumber) // shouldn't change // logs still shouldn't show up, because we don't want to backfill the last finalized log // to help with reorg detection - logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) + logs, err = th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) - assert.Equal(t, 0, len(logs)) + require.Equal(t, 0, len(logs)) th.Backend.Commit() - finalizeThroughBlock(t, th, 35) + finalizeThroughBlock(t, th, 64) // Run ordinary poller + backup poller at least once more - th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber+1) + th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber) th.LogPoller.BackupPollAndSaveLogs(ctx) - currentBlock, _ = th.LogPoller.LatestBlock(ctx) + currentBlock, err := th.LogPoller.LatestBlock(ctx) + require.NoError(t, err) - require.Equal(t, int64(38), currentBlock.BlockNumber+1) + require.Equal(t, int64(64), currentBlock.BlockNumber) // all 3 logs in block 34 should show up now, thanks to backup logger logs, err = th.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) require.NoError(t, err) - assert.Equal(t, 5, len(logs)) - logs, err = th.LogPoller.Logs(ctx, 34, 34, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) + assert.Equal(t, 1, len(logs)) + logs, err = th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) require.NoError(t, err) assert.Equal(t, 1, len(logs)) logs, err = th.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2) @@ -708,7 +741,7 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { // Set up a test chain with a log emitting contract deployed. orm := logpoller.NewORM(chainID, db, lggr) // Note this property test is run concurrently and the sim is not threadsafe. - backend := simulated.NewBackend(map[common.Address]core.GenesisAccount{ + backend := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, diff --git a/core/chains/evm/types/types.go b/core/chains/evm/types/types.go index 57a53bce67a..94bb22e879e 100644 --- a/core/chains/evm/types/types.go +++ b/core/chains/evm/types/types.go @@ -6,10 +6,12 @@ import ( "log/slog" "math/big" "os" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" gethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/jackc/pgtype" pkgerrors "github.com/pkg/errors" "gopkg.in/guregu/null.v4" @@ -400,3 +402,15 @@ func (h *HashArray) Scan(src interface{}) error { } return err } + +// Interface which is satisfied by simulated.Backend. Defined here so that default geth behavior can be +// overridden in tests, and injected into our SimulatedBackend wrapper. This can be used to simulate rpc +// servers with quirky behavior that differs from geth +type Backend interface { + Close() error + Commit() common.Hash + Rollback() + Fork(parentHash common.Hash) error + AdjustTime(adjustment time.Duration) error + Client() simulated.Client +} From 2b2cb35c6e3412d1849edba632f8bdf31e0efde1 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Wed, 29 May 2024 10:54:54 -0700 Subject: [PATCH 14/30] . --- 2 | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 2 diff --git a/2 b/2 deleted file mode 100644 index be07b572723..00000000000 --- a/2 +++ /dev/null @@ -1,7 +0,0 @@ -SELECT FROM ( - SELECT id, block_number, block_hash, log_index - FROM evm.log_poller_filters f JOIN evm.logs l ON - f.evm_chain_id = l.evm_chain_id AND f.address = l.address AND f.event = l.event_sig - WHERE f.evm_chain_id=5 - GROUP BY f.id, l.block_number, l.block_hash, l.log_index -) x order by block_number, log_index; From 105f76d12fc0c5164134073b75c3a9d8a5ff8b70 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 23 May 2024 20:11:00 -0700 Subject: [PATCH 15/30] Update TestLogPoller_PollAndSaveLogsDeepReorg --- core/chains/evm/logpoller/log_poller_test.go | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index fd808a50424..58f9c70a5e1 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -1195,8 +1195,8 @@ func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { lpOpts := logpoller.Opts{ UseFinalityTag: tt.finalityTag, FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, + BackfillBatchSize: 50, + RpcBatchSize: 50, KeepFinalizedBlocksDepth: 1000, } th := SetupTH(t, lpOpts) @@ -1229,7 +1229,7 @@ func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { // Single block reorg and log poller not working for a while, mine blocks and progress with finalization // Chain gen <- 1 <- 2 (L1_1) - // \ 2'(L1_2) <- 3 <- 4 <- 5 <- 6 (finalized on chain) <- 7 <- 8 <- 9 <- 10 + // \ 2'(L1_2) <- 3' <- 4' <- ... <- 32' (finalized on chain) <- 33' <- 34' <- 35' lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Backend.Fork(lca.Hash())) @@ -1237,26 +1237,26 @@ func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) th.Backend.Commit() - // Create 3-10 - for i := 3; i < 10; i++ { + // Create 3-35 + for i := 3; i <= 35; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Backend.Commit() } - //markBlockAsFinalized(t, th, 6) + finalizeThroughBlock(t, th, 32) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(10), newStart) + assert.Equal(t, int64(36), newStart) assert.NoError(t, th.LogPoller.Healthy()) // Expect L1_2 to be properly updated - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) + lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 31) require.NoError(t, err) - require.NotZero(t, len(lgs)) + require.Len(t, lgs, 30) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) - th.assertHaveCanonical(t, 1, 1) - th.assertDontHave(t, 2, 3) // These blocks are backfilled - th.assertHaveCanonical(t, 5, 10) + th.assertHaveCanonical(t, 1, 2) + th.assertDontHave(t, 2, 31) // These blocks are backfilled + th.assertHaveCanonical(t, 32, 36) }) } } @@ -1962,7 +1962,7 @@ func Test_PruneOldBlocks(t *testing.T) { // Commits new blocks until blockNumber is finalized. This requires committing all of // the rest of the blocks in the epoch blockNumber belongs to, where each new epoch -// starts on a 32-block boundary (blockNumber % 32 == 0) +// ends on a 32-block boundary (blockNumber % 32 == 0) func finalizeThroughBlock(t *testing.T, th TestHarness, blockNumber int64) { var currentBlock common.Hash ctx := testutils.Context(t) From 7d0ddf4bef02de846539e58902c3f0a4811296fe Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Thu, 23 May 2024 20:20:37 -0700 Subject: [PATCH 16/30] Not sure how this was working before Presumably, the older verison of simulated.Backend would fill in fake timestamps instead of real ones? --- core/chains/evm/logpoller/log_poller_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 58f9c70a5e1..dee18ec96a2 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -864,7 +864,6 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { b, err := th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) require.Equal(t, uint64(1), b.NumberU64()) - require.Equal(t, uint64(10), b.Time()) // Test scenario: single block in chain, no logs. // Chain genesis <- 1 @@ -878,7 +877,6 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { assert.Equal(t, lpb.BlockHash, b.Hash()) assert.Equal(t, lpb.BlockNumber, int64(b.NumberU64())) assert.Equal(t, int64(1), int64(b.NumberU64())) - assert.Equal(t, uint64(10), b.Time()) // No logs. lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 1) From 260ce9a4fa11965a6ac35830b3f82eedb9e60e79 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 11:37:10 -0700 Subject: [PATCH 17/30] Update TestLogPoller_PollAndSaveLogs --- core/chains/evm/logpoller/log_poller_test.go | 72 ++++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index dee18ec96a2..6f318f40918 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -921,10 +921,8 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // DB: 1, 2 // - Detect a reorg, // - Update the block 2's hash - // - Save L1' + // - Save L1_2 // - L1_1 deleted - reorgedOutBlock, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(2)) - require.NoError(t, err) lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) require.NoError(t, err) require.NoError(t, th.Backend.Fork(lca.Hash())) @@ -946,20 +944,25 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) th.assertHaveCanonical(t, 1, 3) - // Test scenario: reorg back to previous tip. - // Chain gen <- 1 <- 2 (L1_1) <- 3' (L1_3) <- 4 - // \ 2'(L1_2) <- 3 - require.NoError(t, th.Backend.Fork(reorgedOutBlock.Hash())) + parent, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) + + // Test scenario: reorg back to a chain that looks similar to the original chain. (simulated geth used to allow + // re-org'ing back to exactly the same chain--now the best we can do is re-emit the same logs on a new one to simulate that) + // Chain gen <- 1 <- 2 (L1_1) + // \ 2' (L1_2) <- 3 + // \ 2''(L1_1) <- 3' <- 4 + require.NoError(t, th.Backend.Fork(parent.Hash())) + // Re-emit L1 to make 2'' tip look like original 2 tip + _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) + require.NoError(t, err) + th.Backend.Commit() _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) require.NoError(t, err) // Create 3' th.Backend.Commit() // Create 4 th.Backend.Commit() - // Mark block 1 as finalized - if tt.finalityTag { - finalizeThroughBlock(t, th, 1) - } + newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(5), newStart) latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) @@ -967,8 +970,8 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { assert.Equal(t, int64(4), latest.BlockNumber) lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) require.NoError(t, err) - // We expect ONLY L1_1 and L1_3 since L1_2 is reorg'd out. - assert.Equal(t, 2, len(lgs)) + + require.Equal(t, 2, len(lgs)) assert.Equal(t, int64(2), lgs[0].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) assert.Equal(t, int64(3), lgs[1].BlockNumber) @@ -994,9 +997,9 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { // Create 5 th.Backend.Commit() // Mark block 2 as finalized - if tt.finalityTag { - finalizeThroughBlock(t, th, 3) - } + //if tt.finalityTag { + // finalizeThroughBlock(t, th, 3) + //} newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(7), newStart) @@ -1025,10 +1028,6 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { require.NoError(t, err) th.Backend.Commit() } - // Mark block 7 as finalized - if tt.finalityTag { - finalizeThroughBlock(t, th, 7) - } newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) assert.Equal(t, int64(11), newStart) @@ -1041,43 +1040,42 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { assert.Equal(t, int64(8), lgs[1].BlockNumber) assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000009`), lgs[2].Data) assert.Equal(t, int64(9), lgs[2].BlockNumber) - th.assertDontHave(t, 7, 7) // Do not expect to save backfilled blocks. th.assertHaveCanonical(t, 8, 10) // Test scenario large backfill (multiple batches) - // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10..16 + // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10..32 // \ 2'(L1_2) <- 3 - // DB: 1, 2, 3, 4, 5, 6, (backfilled 7), 8, 9, 10 - // - 11, 12, 13 backfilled in batch 1 - // - 14 backfilled in batch 2 - // - 15, 16, 17 to be treated as unfinalized - for i := 11; i < 18; i++ { + // DB: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + // - 11 - 13 backfilled in batch 1 + // - 14 - 16 backfilled in batch 2 + // ... + // - 33, 34, 35 to be treated as unfinalized + for i := 11; i < 36; i++ { _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err) th.Backend.Commit() } - // Mark block 14 as finalized - //markBlockAsFinalized(t, th, 14) newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(18), newStart) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 17) + assert.Equal(t, int64(36), newStart) + lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 36) require.NoError(t, err) - assert.Equal(t, 7, len(lgs)) - th.assertHaveCanonical(t, 14, 16) // Should have last finalized block plus unfinalized blocks + assert.Equal(t, 25, len(lgs)) + th.assertHaveCanonical(t, 32, 36) // Should have last finalized block plus unfinalized blocks th.assertDontHave(t, 11, 13) // Should not have older finalized blocks + th.assertDontHave(t, 14, 16) // Should not have older finalized blocks // Verify that a custom block timestamp will get written to db correctly also b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) - require.Equal(t, uint64(17), b.NumberU64()) - require.Equal(t, uint64(170), b.Time()) - require.NoError(t, th.Backend.AdjustTime(1*time.Hour)) + require.Equal(t, uint64(35), b.NumberU64()) + blockTimestamp := b.Time() + require.NoError(t, th.Backend.AdjustTime(time.Hour)) th.Backend.Commit() b, err = th.Client.BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) - require.Equal(t, uint64(180+time.Hour.Seconds()), b.Time()) + require.Equal(t, blockTimestamp+uint64(time.Hour)+1, b.Time()) }) } } From cb9e7107f90b49c43b78a58a993126f8188ffa34 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 12:08:06 -0700 Subject: [PATCH 18/30] Update TestLogPoller_Blocktimestamps The new Simulated Geth made two changes which affected this test 1. The automatic time interval added to each new block is now 1ns instead of 1s 2. AdjustTime() now automatically calls Commit() so it no longer needs to be called aftewards --- core/chains/evm/logpoller/log_poller_test.go | 28 +++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 6f318f40918..371be6ec48b 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -657,39 +657,37 @@ func TestLogPoller_BlockTimestamps(t *testing.T) { require.Equal(t, big.NewInt(1), blk.Number()) start := blk.Time() - // There is automatically a 10s delay between each block. To make sure it's including the correct block timestamps, + // There is automatically a 1ns delay between each block. To make sure it's including the correct block timestamps, // we introduce irregularities by inserting two additional block delays. We can't control the block times for // blocks produced by the log emitter, but we can adjust the time on empty blocks in between. Simulated time - // sequence: [ #1 ] ..(10s + delay1).. [ #2 ] ..10s.. [ #3 (LOG1) ] ..(10s + delay2).. [ #4 ] ..10s.. [ #5 (LOG2) ] - const delay1 = 589 - const delay2 = 643 - time1 := start + 20 + delay1 - time2 := time1 + 20 + delay2 + // sequence: [ #1 ] ..(1ns + delay1).. [ #2 ] ..1ns.. [ #3 (LOG1) ] ..(1ns + delay2).. [ #4 ] ..1ns.. [ #5 (LOG2) ] + const delay1 = 589 * time.Second + const delay2 = 643 * time.Second + time1 := start + 1 + uint64(delay1) + time2 := time1 + 1 + uint64(delay2) - require.NoError(t, th.Backend.AdjustTime(delay1*time.Second)) - hash := th.Backend.Commit() + require.NoError(t, th.Backend.AdjustTime(delay1)) - blk, err = th.Client.BlockByHash(ctx, hash) + blk, err = th.Client.BlockByNumber(ctx, nil) require.NoError(t, err) require.Equal(t, big.NewInt(2), blk.Number()) - assert.Equal(t, time1-10, blk.Time()) + assert.Equal(t, time1-1, blk.Time()) _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) require.NoError(t, err) - hash = th.Backend.Commit() + hash := th.Backend.Commit() blk, err = th.Client.BlockByHash(ctx, hash) require.NoError(t, err) require.Equal(t, big.NewInt(3), blk.Number()) assert.Equal(t, time1, blk.Time()) - require.NoError(t, th.Backend.AdjustTime(delay2*time.Second)) - th.Backend.Commit() + require.NoError(t, th.Backend.AdjustTime(delay2)) _, err = th.Emitter2.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) require.NoError(t, err) - hash = th.Backend.Commit() + th.Client.Commit() - blk, err = th.Client.BlockByHash(ctx, hash) + blk, err = th.Client.BlockByNumber(ctx, nil) require.NoError(t, err) require.Equal(t, big.NewInt(5), blk.Number()) assert.Equal(t, time2, blk.Time()) From 834211517e03453d3f706a4e661f81b1e9177917 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 13:10:51 -0700 Subject: [PATCH 19/30] Update TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking --- core/chains/evm/logpoller/log_poller_test.go | 33 +++++++++----------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 371be6ec48b..c9b4a1837d5 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -437,7 +437,7 @@ func Test_BackupLogPoller(t *testing.T) { } func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { - emittedLogs := 30 + emittedLogs := 40 // Intentionally use very low backupLogPollerDelay to verify if finality is used properly ctx := testutils.Context(t) lpOpts := logpoller.Opts{ @@ -449,27 +449,25 @@ func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { } th := SetupTH(t, lpOpts) - header, err := th.Client.HeaderByNumber(ctx, nil) - require.NoError(t, err) - // Emit some logs in blocks for i := 0; i < emittedLogs; i++ { + if i == 30 { + // Call PollAndSave with no filters are registered. We call it on block 31, so that + // it misses the logs for blocks 2 - 31 but marks block 0 as finalized (rather than 32) + currentBlock := th.PollAndSaveLogs(ctx, 1) + // currentBlock should be blockChain start + number of emitted logs + 1 + assert.Equal(t, int64(32), currentBlock) + } + _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) require.NoError(t, err2) th.Backend.Commit() } - // First PollAndSave, no filters are registered - // 0 (finalized) -> 1 -> 2 -> ... - currentBlock := th.PollAndSaveLogs(ctx, 1) - // currentBlock should be blockChain start + number of emitted logs + 1 - assert.Equal(t, int64(emittedLogs)+header.Number.Int64()+1, currentBlock) - // LogPoller not working, but chain in the meantime has progressed - // 0 -> 1 -> 2 -> ... -> currentBlock - 10 (finalized) -> .. -> currentBlock - //markBlockAsFinalized(t, th, currentBlock-10) + // 0 -> 1 -> 2 -> ... -> 32 (finalized) -> .. -> 42 (currentBlock) - err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ + err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ Name: "Test Emitter", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}, @@ -484,23 +482,22 @@ func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { logs, err := th.LogPoller.Logs( ctx, 0, - currentBlock, + 42, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, ) require.NoError(t, err) require.Len(t, logs, emittedLogs-10) - // Progressing even more, move blockchain forward by 1 block and mark it as finalized - th.Backend.Commit() - //markBlockAsFinalized(t, th, currentBlock) + // Finalize the rest of the logs emitted, after which Backup Poller should pick them up + finalizeThroughBlock(t, th, 42) th.LogPoller.BackupPollAndSaveLogs(ctx) // All emitted logs should be backfilled logs, err = th.LogPoller.Logs( ctx, 0, - currentBlock+1, + 43, EmitterABI.Events["Log1"].ID, th.EmitterAddress1, ) From b443b6cd0d2fce22c3455e811fb81514364108b0 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 13:55:15 -0700 Subject: [PATCH 20/30] Address PR review comments - Consolidate go-ethereum imports - Remove extra geth-wrapper changes --- core/chains/evm/logpoller/helper_test.go | 8 ++++---- .../functions_allow_list/functions_allow_list.go | 2 +- .../functions_coordinator/functions_coordinator.go | 2 +- .../generated-wrapper-dependency-versions-do-not-edit.txt | 4 ++-- .../generated-wrapper-dependency-versions-do-not-edit.txt | 2 +- .../generated-wrapper-dependency-versions-do-not-edit.txt | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index 652ddf65dd1..1216bd1ad5f 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -8,15 +8,15 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient/simulated" pkgerrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/smartcontractkit/chainlink-common/pkg/logger" diff --git a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go index 023956b7314..2f98ae1623d 100644 --- a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go +++ b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go @@ -37,7 +37,7 @@ type TermsOfServiceAllowListConfig struct { var TermsOfServiceAllowListMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"initialAllowedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"initialBlockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"AddedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"BlockedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"UnblockedAccess\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"allowedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getBlockedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"blockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b5060405162001a3038038062001a308339810160408190526200003491620004d9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001d4565b505050620000d2836200027f60201b60201c565b60005b8251811015620001255762000111838281518110620000f857620000f8620005a8565b602002602001015160026200030660201b90919060201c565b506200011d81620005be565b9050620000d5565b5060005b8151811015620001ca57620001658282815181106200014c576200014c620005a8565b602002602001015160026200032660201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68282815181106200019d576200019d620005a8565b602002602001015160046200030660201b90919060201c565b50620001c281620005be565b905062000129565b50505050620005e6565b336001600160a01b038216036200022e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200028962000349565b805160068054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200031d836001600160a01b038416620003a7565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200031d565b6000546001600160a01b03163314620003a55760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620003f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000320565b50600062000320565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200042757600080fd5b919050565b600082601f8301126200043e57600080fd5b815160206001600160401b03808311156200045d576200045d620003f9565b8260051b604051601f19603f83011681018181108482111715620004855762000485620003f9565b604052938452858101830193838101925087851115620004a457600080fd5b83870191505b84821015620004ce57620004be826200040f565b83529183019190830190620004aa565b979650505050505050565b60008060008385036080811215620004f057600080fd5b6040811215620004ff57600080fd5b50604080519081016001600160401b038082118383101715620005265762000526620003f9565b816040528651915081151582146200053d57600080fd5b8183526200054e602088016200040f565b60208401526040870151929550808311156200056957600080fd5b62000577888489016200042c565b945060608701519250808311156200058e57600080fd5b50506200059e868287016200042c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620005df57634e487b7160e01b600052601160045260246000fd5b5060010190565b61143a80620005f66000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102c3578063cc7ebf4914610322578063f2fde38b1461032a57600080fd5b8063a39b06e314610237578063a5e1d61d146102b057600080fd5b8063817ef62e146101e157806382184c7b146101e957806389f9a2c4146101fc5780638da5cb5b1461020f57600080fd5b80633908c4d4116100ee5780633908c4d41461018e57806347663acb146101a35780636b14daf8146101b657806379ba5097146101d957600080fd5b806301a05958146101205780630a8c9c2414610146578063181f5a771461016657806320229a861461017b575b600080fd5b61012861033d565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610159610154366004610fd6565b61034e565b60405161013d9190611009565b61016e6104bc565b60405161013d9190611063565b610159610189366004610fd6565b6104d8565b6101a161019c3660046110f3565b61063e565b005b6101a16101b1366004611154565b6108e9565b6101c96101c436600461116f565b61094a565b604051901515815260200161013d565b6101a1610974565b610159610a76565b6101a16101f7366004611154565b610a82565b6101a161020a366004611221565b610ae8565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013d565b6102a26102453660046112aa565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b60405190815260200161013d565b6101c96102be366004611154565b610ba3565b60408051808201825260008082526020918201528151808301835260065460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff61010090920482169284019283528451908152915116918101919091520161013d565b610128610bc3565b6101a1610338366004611154565b610bcf565b60006103496004610be3565b905090565b60608167ffffffffffffffff168367ffffffffffffffff16118061038557506103776002610be3565b8267ffffffffffffffff1610155b8061039757506103956002610be3565b155b156103ce576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d88383611303565b6103e3906001611324565b67ffffffffffffffff1667ffffffffffffffff811115610405576104056111f2565b60405190808252806020026020018201604052801561042e578160200160208202803683370190505b50905060005b61043e8484611303565b67ffffffffffffffff1681116104b45761046d6104658267ffffffffffffffff8716611345565b600290610bed565b82828151811061047f5761047f611358565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104ad81611387565b9050610434565b505b92915050565b6040518060600160405280602c8152602001611402602c913981565b60608167ffffffffffffffff168367ffffffffffffffff16118061050f57506105016004610be3565b8267ffffffffffffffff1610155b80610521575061051f6004610be3565b155b15610558576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105628383611303565b61056d906001611324565b67ffffffffffffffff1667ffffffffffffffff81111561058f5761058f6111f2565b6040519080825280602002602001820160405280156105b8578160200160208202803683370190505b50905060005b6105c88484611303565b67ffffffffffffffff1681116104b4576105f76105ef8267ffffffffffffffff8716611345565b600490610bed565b82828151811061060957610609611358565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261063781611387565b90506105be565b610649600485610bf9565b15610680576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206006546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107b4573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161461080b576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061085057503373ffffffffffffffffffffffffffffffffffffffff8716148015906108505750333b155b15610887576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610892600286610c28565b156108e15760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b6108f1610c4a565b6108fc600482610ccd565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b60065460009060ff1661095f5750600161096d565b61096a600285610bf9565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103496002610cef565b610a8a610c4a565b610a95600282610ccd565b50610aa1600482610c28565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161093f565b610af0610c4a565b805160068054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161093f565b60065460009060ff16610bb857506000919050565b6104b6600483610bf9565b60006103496002610be3565b610bd7610c4a565b610be081610cfc565b50565b60006104b6825490565b600061096d8383610df1565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561096d565b600061096d8373ffffffffffffffffffffffffffffffffffffffff8416610e1b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109f1565b565b600061096d8373ffffffffffffffffffffffffffffffffffffffff8416610e6a565b6060600061096d83610f5d565b3373ffffffffffffffffffffffffffffffffffffffff821603610d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610e0857610e08611358565b9060005260206000200154905092915050565b6000818152600183016020526040812054610e62575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104b6565b5060006104b6565b60008181526001830160205260408120548015610f53576000610e8e6001836113bf565b8554909150600090610ea2906001906113bf565b9050818114610f07576000866000018281548110610ec257610ec2611358565b9060005260206000200154905080876000018481548110610ee557610ee5611358565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610f1857610f186113d2565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104b6565b60009150506104b6565b606081600001805480602002602001604051908101604052809291908181526020018280548015610fad57602002820191906000526020600020905b815481526020019060010190808311610f99575b50505050509050919050565b803567ffffffffffffffff81168114610fd157600080fd5b919050565b60008060408385031215610fe957600080fd5b610ff283610fb9565b915061100060208401610fb9565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561105757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611025565b50909695505050505050565b600060208083528351808285015260005b8181101561109057858101830151858201604001528201611074565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610fd157600080fd5b600080600080600060a0868803121561110b57600080fd5b611114866110cf565b9450611122602087016110cf565b93506040860135925060608601359150608086013560ff8116811461114657600080fd5b809150509295509295909350565b60006020828403121561116657600080fd5b61096d826110cf565b60008060006040848603121561118457600080fd5b61118d846110cf565b9250602084013567ffffffffffffffff808211156111aa57600080fd5b818601915086601f8301126111be57600080fd5b8135818111156111cd57600080fd5b8760208285010111156111df57600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006040828403121561123357600080fd5b6040516040810181811067ffffffffffffffff8211171561127d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235801515811461129057600080fd5b815261129e602084016110cf565b60208201529392505050565b600080604083850312156112bd57600080fd5b6112c6836110cf565b9150611000602084016110cf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104b4576104b46112d4565b67ffffffffffffffff8181168382160190808211156104b4576104b46112d4565b808201808211156104b6576104b66112d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113b8576113b86112d4565b5060010190565b818103818111156104b6576104b66112d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e30a164736f6c6343000813000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162001a1e38038062001a1e8339810160408190526200003491620004d9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001d4565b505050620000d2836200027f60201b60201c565b60005b8251811015620001255762000111838281518110620000f857620000f8620005a8565b602002602001015160026200030660201b90919060201c565b506200011d81620005be565b9050620000d5565b5060005b8151811015620001ca57620001658282815181106200014c576200014c620005a8565b602002602001015160026200032660201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68282815181106200019d576200019d620005a8565b602002602001015160046200030660201b90919060201c565b50620001c281620005be565b905062000129565b50505050620005e6565b336001600160a01b038216036200022e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200028962000349565b805160068054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200031d836001600160a01b038416620003a7565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200031d565b6000546001600160a01b03163314620003a55760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620003f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000320565b50600062000320565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200042757600080fd5b919050565b600082601f8301126200043e57600080fd5b815160206001600160401b03808311156200045d576200045d620003f9565b8260051b604051601f19603f83011681018181108482111715620004855762000485620003f9565b604052938452858101830193838101925087851115620004a457600080fd5b83870191505b84821015620004ce57620004be826200040f565b83529183019190830190620004aa565b979650505050505050565b60008060008385036080811215620004f057600080fd5b6040811215620004ff57600080fd5b50604080519081016001600160401b038082118383101715620005265762000526620003f9565b816040528651915081151582146200053d57600080fd5b8183526200054e602088016200040f565b60208401526040870151929550808311156200056957600080fd5b62000577888489016200042c565b945060608701519250808311156200058e57600080fd5b50506200059e868287016200042c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620005df57634e487b7160e01b600052601160045260246000fd5b5060010190565b61142880620005f66000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102c3578063cc7ebf4914610322578063f2fde38b1461032a57600080fd5b8063a39b06e314610237578063a5e1d61d146102b057600080fd5b8063817ef62e146101e157806382184c7b146101e957806389f9a2c4146101fc5780638da5cb5b1461020f57600080fd5b80633908c4d4116100ee5780633908c4d41461018e57806347663acb146101a35780636b14daf8146101b657806379ba5097146101d957600080fd5b806301a05958146101205780630a8c9c2414610146578063181f5a771461016657806320229a861461017b575b600080fd5b61012861033d565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610159610154366004610fc4565b61034e565b60405161013d9190610ff7565b61016e6104aa565b60405161013d9190611051565b610159610189366004610fc4565b6104c6565b6101a161019c3660046110e1565b61062c565b005b6101a16101b1366004611142565b6108d7565b6101c96101c436600461115d565b610938565b604051901515815260200161013d565b6101a1610962565b610159610a64565b6101a16101f7366004611142565b610a70565b6101a161020a36600461120f565b610ad6565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013d565b6102a2610245366004611298565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b60405190815260200161013d565b6101c96102be366004611142565b610b91565b60408051808201825260008082526020918201528151808301835260065460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff61010090920482169284019283528451908152915116918101919091520161013d565b610128610bb1565b6101a1610338366004611142565b610bbd565b60006103496004610bd1565b905090565b60608167ffffffffffffffff168367ffffffffffffffff16118061038557506103776002610bd1565b8267ffffffffffffffff1610155b156103bc576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c683836112f1565b6103d1906001611312565b67ffffffffffffffff1667ffffffffffffffff8111156103f3576103f36111e0565b60405190808252806020026020018201604052801561041c578160200160208202803683370190505b50905060005b61042c84846112f1565b67ffffffffffffffff1681116104a25761045b6104538267ffffffffffffffff8716611333565b600290610bdb565b82828151811061046d5761046d611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261049b81611375565b9050610422565b505b92915050565b6040518060600160405280602c81526020016113f0602c913981565b60608167ffffffffffffffff168367ffffffffffffffff1611806104fd57506104ef6004610bd1565b8267ffffffffffffffff1610155b8061050f575061050d6004610bd1565b155b15610546576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61055083836112f1565b61055b906001611312565b67ffffffffffffffff1667ffffffffffffffff81111561057d5761057d6111e0565b6040519080825280602002602001820160405280156105a6578160200160208202803683370190505b50905060005b6105b684846112f1565b67ffffffffffffffff1681116104a2576105e56105dd8267ffffffffffffffff8716611333565b600490610bdb565b8282815181106105f7576105f7611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261062581611375565b90506105ac565b610637600485610be7565b1561066e576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206006546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107a2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16146107f9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061083e57503373ffffffffffffffffffffffffffffffffffffffff87161480159061083e5750333b155b15610875576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610880600286610c16565b156108cf5760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b6108df610c38565b6108ea600482610cbb565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b60065460009060ff1661094d5750600161095b565b610958600285610be7565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103496002610cdd565b610a78610c38565b610a83600282610cbb565b50610a8f600482610c16565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161092d565b610ade610c38565b805160068054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161092d565b60065460009060ff16610ba657506000919050565b6104a4600483610be7565b60006103496002610bd1565b610bc5610c38565b610bce81610cea565b50565b60006104a4825490565b600061095b8383610ddf565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561095b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e09565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109df565b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e58565b6060600061095b83610f4b565b3373ffffffffffffffffffffffffffffffffffffffff821603610d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109df565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610df657610df6611346565b9060005260206000200154905092915050565b6000818152600183016020526040812054610e50575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a4565b5060006104a4565b60008181526001830160205260408120548015610f41576000610e7c6001836113ad565b8554909150600090610e90906001906113ad565b9050818114610ef5576000866000018281548110610eb057610eb0611346565b9060005260206000200154905080876000018481548110610ed357610ed3611346565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610f0657610f066113c0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a4565b60009150506104a4565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f9b57602002820191906000526020600020905b815481526020019060010190808311610f87575b50505050509050919050565b803567ffffffffffffffff81168114610fbf57600080fd5b919050565b60008060408385031215610fd757600080fd5b610fe083610fa7565b9150610fee60208401610fa7565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561104557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611013565b50909695505050505050565b600060208083528351808285015260005b8181101561107e57858101830151858201604001528201611062565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610fbf57600080fd5b600080600080600060a086880312156110f957600080fd5b611102866110bd565b9450611110602087016110bd565b93506040860135925060608601359150608086013560ff8116811461113457600080fd5b809150509295509295909350565b60006020828403121561115457600080fd5b61095b826110bd565b60008060006040848603121561117257600080fd5b61117b846110bd565b9250602084013567ffffffffffffffff8082111561119857600080fd5b818601915086601f8301126111ac57600080fd5b8135818111156111bb57600080fd5b8760208285010111156111cd57600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006040828403121561122157600080fd5b6040516040810181811067ffffffffffffffff8211171561126b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235801515811461127e57600080fd5b815261128c602084016110bd565b60208201529392505050565b600080604083850312156112ab57600080fd5b6112b4836110bd565b9150610fee602084016110bd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104a2576104a26112c2565b67ffffffffffffffff8181168382160190808211156104a2576104a26112c2565b808201808211156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113a6576113a66112c2565b5060010190565b818103818111156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e30a164736f6c6343000813000a", } var TermsOfServiceAllowListABI = TermsOfServiceAllowListMetaData.ABI diff --git a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go index 6099c541c69..286cb1befd6 100644 --- a/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go +++ b/core/gethwrappers/functions/generated/functions_coordinator/functions_coordinator.go @@ -75,7 +75,7 @@ type FunctionsResponseRequestMeta struct { var FunctionsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"linkToNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkToUsdFeed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EmptyPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentReportData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"usdLink\",\"type\":\"int256\"}],\"name\":\"InvalidUsdLinkPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoTransmittersSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByRouterOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"ReportInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustBeSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedPublicKeyChange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedRequestDataVersion\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"CommitmentDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requestInitiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"callbackGasLimit\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint72\",\"name\":\"donFee\",\"type\":\"uint72\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint32\",\"name\":\"timeoutTimestamp\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structFunctionsResponse.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"name\":\"OracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"OracleResponse\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"juelsPerGas\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l1FeeShareWei\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"callbackCostJuels\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"donFeeJuels\",\"type\":\"uint72\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"adminFeeJuels\",\"type\":\"uint72\"},{\"indexed\":false,\"internalType\":\"uint72\",\"name\":\"operationFeeJuels\",\"type\":\"uint72\"}],\"name\":\"RequestBilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"deleteCommitment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"gasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateCost\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdminFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"getDONFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOperationFeeJuels\",\"outputs\":[{\"internalType\":\"uint72\",\"name\":\"\",\"type\":\"uint72\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThresholdPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getUsdPerUnitLink\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"oracleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleWithdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"donPublicKey\",\"type\":\"bytes\"}],\"name\":\"setDONPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"thresholdPublicKey\",\"type\":\"bytes\"}],\"name\":\"setThresholdPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"flags\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"requestingContract\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"availableBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initiatedRequests\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"dataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"completedRequests\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"subscriptionOwner\",\"type\":\"address\"}],\"internalType\":\"structFunctionsResponse.RequestMeta\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"startRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coordinator\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"estimatedTotalCostJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"client\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"subscriptionId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint72\",\"name\":\"adminFee\",\"type\":\"uint72\"},{\"internalType\":\"uint72\",\"name\":\"donFee\",\"type\":\"uint72\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint40\"},{\"internalType\":\"uint32\",\"name\":\"timeoutTimestamp\",\"type\":\"uint32\"}],\"internalType\":\"structFunctionsResponse.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentGasPriceOverEstimationBP\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"feedStalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadBeforeCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasOverheadAfterCallback\",\"type\":\"uint32\"},{\"internalType\":\"uint40\",\"name\":\"minimumEstimateGasPriceWei\",\"type\":\"uint40\"},{\"internalType\":\"uint16\",\"name\":\"maxSupportedRequestDataVersion\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"fallbackUsdPerUnitLink\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"fallbackUsdPerUnitLinkDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint224\",\"name\":\"fallbackNativePerUnitLink\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"requestTimeoutSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"donFeeCentsUsd\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"operationFeeCentsUsd\",\"type\":\"uint16\"}],\"internalType\":\"structFunctionsBillingConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200601f3803806200601f8339810160408190526200003491620004db565b83838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200014e565b5050506001600160a01b038116620000ee57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03908116608052600c80546001600160601b03166c0100000000000000000000000085841602179055600d80546001600160a01b0319169183169190911790556200014083620001f9565b505050505050505062000742565b336001600160a01b03821603620001a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620002036200039e565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff16600160f81b026001600160f81b036001600160401b03909216600160b81b02919091166001600160b81b0361ffff938416600160a81b0261ffff60a81b1964ffffffffff909616600160801b029590951666ffffffffffffff60801b1963ffffffff9788166c010000000000000000000000000263ffffffff60601b19998916680100000000000000000299909916600160401b600160801b03199b8916640100000000026001600160401b0319909d169e89169e909e179b909b17999099169b909b1795909517979097169590951717969096161792909217909255610100840151610120850151909316600160e01b026001600160e01b0390931692909217600955610140830151600a80546101608601518416620100000263ffffffff19919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a906200039390839062000639565b60405180910390a150565b620003a8620003aa565b565b6000546001600160a01b03163314620003a85760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000087565b80516001600160a01b03811681146200041e57600080fd5b919050565b60405161018081016001600160401b03811182821017156200045557634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff811681146200041e57600080fd5b805164ffffffffff811681146200041e57600080fd5b805161ffff811681146200041e57600080fd5b80516001600160401b03811681146200041e57600080fd5b805160ff811681146200041e57600080fd5b80516001600160e01b03811681146200041e57600080fd5b6000806000808486036101e0811215620004f457600080fd5b620004ff8662000406565b945061018080601f19830112156200051657600080fd5b6200052062000423565b915062000530602088016200045b565b825262000540604088016200045b565b602083015262000553606088016200045b565b604083015262000566608088016200045b565b60608301526200057960a0880162000470565b60808301526200058c60c0880162000486565b60a08301526200059f60e0880162000499565b60c0830152610100620005b4818901620004b1565b60e0840152610120620005c9818a01620004c3565b828501526101409150620005df828a016200045b565b90840152610160620005f389820162000486565b8285015262000604838a0162000486565b90840152509093506200061d90506101a0860162000406565b91506200062e6101c0860162000406565b905092959194509250565b815163ffffffff1681526101808101602083015162000660602084018263ffffffff169052565b50604083015162000679604084018263ffffffff169052565b50606083015162000692606084018263ffffffff169052565b506080830151620006ac608084018264ffffffffff169052565b5060a0830151620006c360a084018261ffff169052565b5060c0830151620006df60c08401826001600160401b03169052565b5060e0830151620006f560e084018260ff169052565b50610100838101516001600160e01b0316908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101609384015116929091019190915290565b608051615897620007886000396000818161079c01528181610c7d01528181610f110152818161102701528181611b2d015281816129eb015261396901526158976000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638da5cb5b116100ee578063d227d24511610097578063e4ddcea611610071578063e4ddcea6146105d5578063f2f22ef1146105eb578063f2fde38b146105f3578063f6ea41f61461060657600080fd5b8063d227d2451461058a578063d328a91e146105ba578063e3d0e712146105c257600080fd5b8063b1dc65a4116100c8578063b1dc65a414610396578063ba9c924d146103a9578063c3f909d4146103bc57600080fd5b80638da5cb5b1461032e578063a631571e14610356578063afcb95d71461037657600080fd5b80637d4807871161015057806381f1b9381161012a57806381f1b938146102a657806381ff7048146102ae57806385b214cf1461031b57600080fd5b80637d480787146102765780637f15e1661461027e578063814118341461029157600080fd5b806366316d8d1161018157806366316d8d1461023c5780637212762f1461024f57806379ba50971461026e57600080fd5b8063083a5466146101a8578063181f5a77146101bd578063626f458c1461020f575b600080fd5b6101bb6101b6366004614010565b61060e565b005b6101f96040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e332e300000000081525081565b60405161020691906140c0565b60405180910390f35b61022261021d36600461422d565b610663565b60405168ffffffffffffffffff9091168152602001610206565b6101bb61024a3660046142b4565b6106a0565b610257610859565b6040805192835260ff909116602083015201610206565b6101bb610a6c565b6101bb610b69565b6101bb61028c366004614010565b610d69565b610299610db9565b604051610206919061433e565b6101f9610e28565b6102f860015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610206565b6101bb610329366004614351565b610ef9565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b61036961036436600461436a565b610fb6565b60405161020691906144bf565b604080516001815260006020820181905291810191909152606001610206565b6101bb6103a4366004614513565b611247565b6101bb6103b736600461467e565b61185e565b61057d6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915250604080516101808101825260085463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830152700100000000000000000000000000000000810464ffffffffff1660808301527501000000000000000000000000000000000000000000810461ffff90811660a084015277010000000000000000000000000000000000000000000000820467ffffffffffffffff1660c08401527f010000000000000000000000000000000000000000000000000000000000000090910460ff1660e08301526009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166101008401527c01000000000000000000000000000000000000000000000000000000009004909216610120820152600a5480831661014083015262010000900490911661016082015290565b604051610206919061476a565b61059d610598366004614887565b611b29565b6040516bffffffffffffffffffffffff9091168152602001610206565b6101f9611c97565b6101bb6105d036600461498f565b611cee565b6105dd61286a565b604051908152602001610206565b6102226129ae565b6101bb610601366004614a5c565b6129d3565b6102226129e7565b610616612a78565b6000819003610651576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f61065e828483614b0c565b505050565b600a5460009061069a9060649061067d9061ffff16612afb565b6106879190614c85565b6bffffffffffffffffffffffff16612b48565b92915050565b6106a8612be7565b806bffffffffffffffffffffffff166000036106e25750336000908152600b60205260409020546bffffffffffffffffffffffff1661073c565b336000908152600b60205260409020546bffffffffffffffffffffffff8083169116101561073c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b6020526040812080548392906107699084906bffffffffffffffffffffffff16614cb0565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506107be7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526bffffffffffffffffffffffff8416602483015291909116906366316d8d90604401600060405180830381600087803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b505050505050565b600080600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614cf6565b5093505092505080426109039190614d46565b600854640100000000900463ffffffff161080156109305750600854640100000000900463ffffffff1615155b1561098d57505060085477010000000000000000000000000000000000000000000000810467ffffffffffffffff16937f010000000000000000000000000000000000000000000000000000000000000090910460ff1692509050565b600082136109cf576040517f56b22ab8000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600d54604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051849273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a629190614d59565b9350935050509091565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b71612d93565b610b79612be7565b6000610b83610db9565b905060005b8151811015610d65576000600b6000848481518110610ba957610ba9614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252810191909152604001600020546bffffffffffffffffffffffff1690508015610d54576000600b6000858581518110610c0857610c08614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610c9f7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166366316d8d848481518110610ccc57610ccc614d76565b6020026020010151836040518363ffffffff1660e01b8152600401610d2192919073ffffffffffffffffffffffffffffffffffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050505b50610d5e81614da5565b9050610b88565b5050565b610d71612a78565b6000819003610dac576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e61065e828483614b0c565b60606006805480602002602001604051908101604052809291908181526020018280548015610e1e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df3575b5050505050905090565b6060600f8054610e3790614a79565b9050600003610e72576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f8054610e7f90614a79565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90614a79565b8015610e1e5780601f10610ecd57610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610edb57509395945050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f68576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526007602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610fab9083815260200190565b60405180910390a150565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461107e576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061109161108c84614dff565b612d9b565b90925090506110a66060840160408501614a5c565b825173ffffffffffffffffffffffffffffffffffffffff91909116907fbf50768ccf13bd0110ca6d53a9c4f1f3271abdd4c24a56878863ed25b20598ff326110f460c0880160a08901614eec565b61110661016089016101408a01614a5c565b6111108980614f09565b6111226101208c016101008d01614f6e565b60208c01356111386101008e0160e08f01614f89565b6040518061016001604052808e6000015181526020018e6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018e604001516bffffffffffffffffffffffff1681526020018e6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6080015167ffffffffffffffff1681526020018e60a0015163ffffffff1681526020018d68ffffffffffffffffff1681526020018e60e0015168ffffffffffffffffff1681526020018e610100015164ffffffffff1681526020018e610120015164ffffffffff1681526020018e610140015163ffffffff1681525060405161123899989796959493929190614fa6565b60405180910390a3505b919050565b600080611254898961314d565b915091508115611265575050611854565b604080518b3580825262ffffff6020808f0135600881901c9290921690840152909290917fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16112c28b8b8b8b8b8b6132d6565b6003546000906002906112e09060ff8082169161010090041661505c565b6112ea9190615075565b6112f590600161505c565b60ff169050888114611363576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e61747572657300000000000060448201526064016109c6565b8887146113f2576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f7265706f727420727320616e64207373206d757374206265206f66206571756160448201527f6c206c656e67746800000000000000000000000000000000000000000000000060648201526084016109c6565b3360009081526004602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561143557611435615097565b600281111561144657611446615097565b905250905060028160200151600281111561146357611463615097565b141580156114ac57506006816000015160ff168154811061148657611486614d76565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff163314155b15611513576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d6974746572000000000000000060448201526064016109c6565b5050505061151f613faf565b60008a8a6040516115319291906150c6565b604051908190038120611548918e906020016150d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b898110156118445760006001848984602081106115b1576115b1614d76565b6115be91901a601b61505c565b8e8e868181106115d0576115d0614d76565b905060200201358d8d878181106115e9576115e9614d76565b9050602002013560405160008152602001604052604051611626949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611648573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156116c8576116c8615097565b60028111156116d9576116d9615097565b90525092506001836020015160028111156116f6576116f6615097565b1461175d576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e000060448201526064016109c6565b8251600090869060ff16601f811061177757611777614d76565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e617475726500000000000000000000000060448201526064016109c6565b8085846000015160ff16601f811061181357611813614d76565b73ffffffffffffffffffffffffffffffffffffffff90921660209290920201525061183d81614da5565b9050611592565b5050506118508261338d565b5050505b5050505050505050565b611866612d93565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff167f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff90921677010000000000000000000000000000000000000000000000029190911676ffffffffffffffffffffffffffffffffffffffffffffff61ffff9384167501000000000000000000000000000000000000000000027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff64ffffffffff90961670010000000000000000000000000000000002959095167fffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff63ffffffff9788166c01000000000000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff9989166801000000000000000002999099167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9b8916640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909d169e89169e909e179b909b17999099169b909b17959095179790971695909517179690961617929092179092556101008401516101208501519093167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217600955610140830151600a8054610160860151841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a90610fab90839061476a565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611bc957600080fd5b505afa158015611bdd573d6000803e3d6000fd5b5050505066038d7ea4c68000821115611c22576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2c6129e7565b90506000611c6f87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066392505050565b90506000611c7b6129ae565b9050611c8a86868486856134dc565b9998505050505050505050565b6060600e8054611ca690614a79565b9050600003611ce1576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054610e7f90614a79565b855185518560ff16601f831115611d61576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e6572730000000000000000000000000000000060448201526064016109c6565b80600003611dcb576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016109c6565b818314611e59576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109c6565b611e648160036150ea565b8311611ecc576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f2068696768000000000000000060448201526064016109c6565b611ed4612a78565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611f1b9088613658565b600554156120d057600554600090611f3590600190614d46565b9050600060058281548110611f4c57611f4c614d76565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff90921693509084908110611f8657611f86614d76565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559290911680845292208054909116905560058054919250908061200657612006615101565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055600680548061206f5761206f615101565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611f1b915050565b60005b815151811015612687578151805160009190839081106120f5576120f5614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361217a576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7369676e6572206d757374206e6f7420626520656d707479000000000000000060448201526064016109c6565b600073ffffffffffffffffffffffffffffffffffffffff16826020015182815181106121a8576121a8614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361222d576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e736d6974746572206d757374206e6f7420626520656d70747900000060448201526064016109c6565b6000600460008460000151848151811061224957612249614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561229357612293615097565b146122fa576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e6572206164647265737300000000000000000060448201526064016109c6565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061232b5761232b614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156123cc576123cc615097565b0217905550600091506123dc9050565b60046000846020015184815181106123f6576123f6614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff16600281111561244057612440615097565b146124a7576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016109c6565b6040805180820190915260ff8216815260208101600281525060046000846020015184815181106124da576124da614d76565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561257b5761257b615097565b02179055505082518051600592508390811061259957612599614d76565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061261557612615614d76565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790558061267f81614da5565b9150506120d3565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161273f91849174010000000000000000000000000000000000000000900416615130565b92506101000a81548163ffffffff021916908363ffffffff16021790555061279e4630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a00151613671565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0598612855988b9891977401000000000000000000000000000000000000000090920463ffffffff1696909591949193919261514d565b60405180910390a15050505050505050505050565b6000806000600c8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156128da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fe9190614cf6565b5093505092505080426129119190614d46565b600854640100000000900463ffffffff1610801561293e5750600854640100000000900463ffffffff1615155b1561296b5750506009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b600082136129a8576040517f43d4cf66000000000000000000000000000000000000000000000000000000008152600481018390526024016109c6565b50919050565b600a546000906129ce9060649061067d9062010000900461ffff16612afb565b905090565b6129db612a78565b6129e48161371c565b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a905ccc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce91906151ee565b60005473ffffffffffffffffffffffffffffffffffffffff163314612af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c6565b565b6000806000612b08610859565b9092509050612b4082612b1c83601261505c565b612b2790600a61532b565b612b3190876150ea565b612b3b919061533a565b613811565b949350505050565b600068ffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203760448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b5090565b600c546bffffffffffffffffffffffff16600003612c0157565b6000612c0b610db9565b80519091506000819003612c4b576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600090612c6a9083906bffffffffffffffffffffffff16614c85565b905060005b82811015612d355781600b6000868481518110612c8e57612c8e614d76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff16612cf6919061534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080612d2e90614da5565b9050612c6f565b50612d408282615373565b600c8054600090612d609084906bffffffffffffffffffffffff16614cb0565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b612af9612a78565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260085461010083015160009161ffff7501000000000000000000000000000000000000000000909104811691161115612e59576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e688460000151610663565b9050612e726129ae565b91506000612e8b8560e001513a848860800151876134dc565b9050806bffffffffffffffffffffffff1685606001516bffffffffffffffffffffffff161015612ee7576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600090612f1d907c0100000000000000000000000000000000000000000000000000000000900463ffffffff164261539b565b905060003087604001518860a001518960c001516001612f3d91906153ae565b8a5180516020918201206101008d015160e08e0151604051612ff198979695948c918c9132910173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a015267ffffffffffffffff97881660408a0152959096166060880152608087019390935261ffff9190911660a086015263ffffffff90811660c08601526bffffffffffffffffffffffff9190911660e0850152919091166101008301529091166101208201526101400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206101608401835280845230848301526bffffffffffffffffffffffff8716848401528a83015173ffffffffffffffffffffffffffffffffffffffff16606085015260a0808c015167ffffffffffffffff1660808087019190915260e0808e015163ffffffff90811693880193909352908d015168ffffffffffffffffff90811660c08801528a169086015260085468010000000000000000810482166101008701526c0100000000000000000000000090048116610120860152861661014085015291519298509092506130fd918891016144bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600093845260079092529091205550929491935090915050565b60006131816040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b600080808080613193888a018a6154aa565b84519499509297509095509350915060ff168015806131b3575084518114155b806131bf575083518114155b806131cb575082518114155b806131d7575081518114155b1561323e576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4669656c6473206d75737420626520657175616c206c656e677468000000000060448201526064016109c6565b60005b818110156132a45761327a87828151811061325e5761325e614d76565b6020026020010151600090815260076020526040902054151590565b6132a457613289600183614d46565b810361329457600198505b61329d81614da5565b9050613241565b50506040805160a0810182529586526020860194909452928401919091526060830152608082015290505b9250929050565b60006132e38260206150ea565b6132ee8560206150ea565b6132fa8861014461539b565b613304919061539b565b61330e919061539b565b61331990600061539b565b9050368114613384576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d61746368000000000000000060448201526064016109c6565b50505050505050565b80515160ff1660005b8181101561065e57600061343f846000015183815181106133b9576133b9614d76565b6020026020010151856020015184815181106133d7576133d7614d76565b6020026020010151866040015185815181106133f5576133f5614d76565b60200260200101518760600151868151811061341357613413614d76565b60200260200101518860800151878151811061343157613431614d76565b6020026020010151886138af565b9050600081600681111561345557613455615097565b14806134725750600181600681111561347057613470615097565b145b156134cb57835180518390811061348b5761348b614d76565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b506134d581614da5565b9050613396565b600854600090700100000000000000000000000000000000900464ffffffffff1685101561352557600854700100000000000000000000000000000000900464ffffffffff1694505b6008546000906127109061353f9063ffffffff16886150ea565b613549919061533a565b613553908761539b565b600854909150600090889061358c9063ffffffff6c01000000000000000000000000820481169168010000000000000000900416615130565b6135969190615130565b63ffffffff16905060006135e06000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d7392505050565b90506000613601826135f285876150ea565b6135fc919061539b565b613eb5565b905060008668ffffffffffffffffff168868ffffffffffffffffff168a68ffffffffffffffffff16613633919061534e565b61363d919061534e565b9050613649818361534e565b9b9a5050505050505050505050565b6000613662610db9565b511115610d6557610d65612be7565b6000808a8a8a8a8a8a8a8a8a6040516020016136959998979695949392919061557c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361379b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006bffffffffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f362062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b600080848060200190518101906138c69190615648565b905060003a8261012001518361010001516138e19190615710565b64ffffffffff166138f291906150ea565b905060008460ff1661393a6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d7392505050565b613944919061533a565b905060006139556135fc838561539b565b905060006139623a613eb5565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663330605298e8e868b60c0015168ffffffffffffffffff168c60e0015168ffffffffffffffffff168a6139d1919061534e565b6139db919061534e565b336040518061016001604052808f6000015181526020018f6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018f604001516bffffffffffffffffffffffff1681526020018f6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018f6080015167ffffffffffffffff1681526020018f60a0015163ffffffff168152602001600068ffffffffffffffffff1681526020018f60e0015168ffffffffffffffffff1681526020018f610100015164ffffffffff1681526020018f610120015164ffffffffff1681526020018f610140015163ffffffff168152506040518763ffffffff1660e01b8152600401613ae99695949392919061572e565b60408051808303816000875af1158015613b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2b91906157aa565b90925090506000826006811115613b4457613b44615097565b1480613b6157506001826006811115613b5f57613b5f615097565b145b15613d625760008e815260076020526040812055613b7f818561534e565b336000908152600b602052604081208054909190613bac9084906bffffffffffffffffffffffff1661534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660e0015168ffffffffffffffffff16600c60008282829054906101000a90046bffffffffffffffffffffffff16613c12919061534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660c0015168ffffffffffffffffff16600b6000613c5c613ed4565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190613ca29084906bffffffffffffffffffffffff1661534e565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508d7f08a4a0761e3c98d288cb4af9342660f49550d83139fb3b762b70d34bed6273688487848b60e0015160008d60c00151604051613d59969594939291906bffffffffffffffffffffffff9687168152602081019590955292909416604084015268ffffffffffffffffff9081166060840152928316608083015290911660a082015260c00190565b60405180910390a25b509c9b505050505050505050505050565b600046613d7f81613f45565b15613dfb57606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613df491906157dd565b9392505050565b613e0481613f68565b15613eac5773420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff166349948e0e8460405180608001604052806048815260200161584360489139604051602001613e649291906157f6565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613e8f91906140c0565b602060405180830381865afa158015613dd0573d6000803e3d6000fd5b50600092915050565b600061069a613ec261286a565b612b3184670de0b6b3a76400006150ea565b60003073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f21573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615825565b600061a4b1821480613f59575062066eed82145b8061069a57505062066eee1490565b6000600a821480613f7a57506101a482145b80613f87575062aa37dc82145b80613f93575061210582145b80613fa0575062014a3382145b8061069a57505062014a341490565b604051806103e00160405280601f906020820280368337509192915050565b60008083601f840112613fe057600080fd5b50813567ffffffffffffffff811115613ff857600080fd5b6020830191508360208285010111156132cf57600080fd5b6000806020838503121561402357600080fd5b823567ffffffffffffffff81111561403a57600080fd5b61404685828601613fce565b90969095509350505050565b60005b8381101561406d578181015183820152602001614055565b50506000910152565b6000815180845261408e816020860160208601614052565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613df46020830184614076565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715614126576141266140d3565b60405290565b604051610160810167ffffffffffffffff81118282101715614126576141266140d3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614197576141976140d3565b604052919050565b600082601f8301126141b057600080fd5b813567ffffffffffffffff8111156141ca576141ca6140d3565b6141fb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614150565b81815284602083860101111561421057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561423f57600080fd5b813567ffffffffffffffff81111561425657600080fd5b612b408482850161419f565b73ffffffffffffffffffffffffffffffffffffffff811681146129e457600080fd5b803561124281614262565b6bffffffffffffffffffffffff811681146129e457600080fd5b80356112428161428f565b600080604083850312156142c757600080fd5b82356142d281614262565b915060208301356142e28161428f565b809150509250929050565b600081518084526020808501945080840160005b8381101561433357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614301565b509495945050505050565b602081526000613df460208301846142ed565b60006020828403121561436357600080fd5b5035919050565b60006020828403121561437c57600080fd5b813567ffffffffffffffff81111561439357600080fd5b82016101608185031215613df457600080fd5b8051825260208101516143d1602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408101516143f160408401826bffffffffffffffffffffffff169052565b506060810151614419606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080810151614435608084018267ffffffffffffffff169052565b5060a081015161444d60a084018263ffffffff169052565b5060c081015161446a60c084018268ffffffffffffffffff169052565b5060e081015161448760e084018268ffffffffffffffffff169052565b506101008181015164ffffffffff9081169184019190915261012080830151909116908301526101409081015163ffffffff16910152565b610160810161069a82846143a6565b60008083601f8401126144e057600080fd5b50813567ffffffffffffffff8111156144f857600080fd5b6020830191508360208260051b85010111156132cf57600080fd5b60008060008060008060008060e0898b03121561452f57600080fd5b606089018a81111561454057600080fd5b8998503567ffffffffffffffff8082111561455a57600080fd5b6145668c838d01613fce565b909950975060808b013591508082111561457f57600080fd5b61458b8c838d016144ce565b909750955060a08b01359150808211156145a457600080fd5b506145b18b828c016144ce565b999c989b50969995989497949560c00135949350505050565b63ffffffff811681146129e457600080fd5b8035611242816145ca565b64ffffffffff811681146129e457600080fd5b8035611242816145e7565b803561ffff8116811461124257600080fd5b67ffffffffffffffff811681146129e457600080fd5b803561124281614617565b60ff811681146129e457600080fd5b803561124281614638565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461124257600080fd5b6000610180828403121561469157600080fd5b614699614102565b6146a2836145dc565b81526146b0602084016145dc565b60208201526146c1604084016145dc565b60408201526146d2606084016145dc565b60608201526146e3608084016145fa565b60808201526146f460a08401614605565b60a082015261470560c0840161462d565b60c082015261471660e08401614647565b60e0820152610100614729818501614652565b9082015261012061473b8482016145dc565b9082015261014061474d848201614605565b9082015261016061475f848201614605565b908201529392505050565b815163ffffffff16815261018081016020830151614790602084018263ffffffff169052565b5060408301516147a8604084018263ffffffff169052565b5060608301516147c0606084018263ffffffff169052565b5060808301516147d9608084018264ffffffffff169052565b5060a08301516147ef60a084018261ffff169052565b5060c083015161480b60c084018267ffffffffffffffff169052565b5060e083015161482060e084018260ff169052565b50610100838101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101608085015191821681850152905b505092915050565b60008060008060006080868803121561489f57600080fd5b85356148aa81614617565b9450602086013567ffffffffffffffff8111156148c657600080fd5b6148d288828901613fce565b90955093505060408601356148e6816145ca565b949793965091946060013592915050565b600067ffffffffffffffff821115614911576149116140d3565b5060051b60200190565b600082601f83011261492c57600080fd5b8135602061494161493c836148f7565b614150565b82815260059290921b8401810191818101908684111561496057600080fd5b8286015b8481101561498457803561497781614262565b8352918301918301614964565b509695505050505050565b60008060008060008060c087890312156149a857600080fd5b863567ffffffffffffffff808211156149c057600080fd5b6149cc8a838b0161491b565b975060208901359150808211156149e257600080fd5b6149ee8a838b0161491b565b96506149fc60408a01614647565b95506060890135915080821115614a1257600080fd5b614a1e8a838b0161419f565b9450614a2c60808a0161462d565b935060a0890135915080821115614a4257600080fd5b50614a4f89828a0161419f565b9150509295509295509295565b600060208284031215614a6e57600080fd5b8135613df481614262565b600181811c90821680614a8d57607f821691505b6020821081036129a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561065e57600081815260208120601f850160051c81016020861015614aed5750805b601f850160051c820191505b8181101561085157828155600101614af9565b67ffffffffffffffff831115614b2457614b246140d3565b614b3883614b328354614a79565b83614ac6565b6000601f841160018114614b8a5760008515614b545750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614c20565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614bd95786850135825560209485019460019092019101614bb9565b5086821015614c14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006bffffffffffffffffffffffff80841680614ca457614ca4614c27565b92169190910492915050565b6bffffffffffffffffffffffff828116828216039080821115614cd557614cd5614c56565b5092915050565b805169ffffffffffffffffffff8116811461124257600080fd5b600080600080600060a08688031215614d0e57600080fd5b614d1786614cdc565b9450602086015193506040860151925060608601519150614d3a60808701614cdc565b90509295509295909350565b8181038181111561069a5761069a614c56565b600060208284031215614d6b57600080fd5b8151613df481614638565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614dd657614dd6614c56565b5060010190565b68ffffffffffffffffff811681146129e457600080fd5b803561124281614ddd565b60006101608236031215614e1257600080fd5b614e1a61412c565b823567ffffffffffffffff811115614e3157600080fd5b614e3d3682860161419f565b82525060208301356020820152614e5660408401614284565b6040820152614e67606084016142a9565b6060820152614e7860808401614df4565b6080820152614e8960a0840161462d565b60a0820152614e9a60c0840161462d565b60c0820152614eab60e084016145dc565b60e0820152610100614ebe818501614605565b90820152610120614ed084820161462d565b90820152610140614ee2848201614284565b9082015292915050565b600060208284031215614efe57600080fd5b8135613df481614617565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f3e57600080fd5b83018035915067ffffffffffffffff821115614f5957600080fd5b6020019150368190038213156132cf57600080fd5b600060208284031215614f8057600080fd5b613df482614605565b600060208284031215614f9b57600080fd5b8135613df4816145ca565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a166020830152881660408201526102406060820181905281018690526000610260878982850137600083890182015261ffff8716608084015260a0830186905263ffffffff851660c0840152601f88017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016830101905061504e60e08301846143a6565b9a9950505050505050505050565b60ff818116838216019081111561069a5761069a614c56565b600060ff83168061508857615088614c27565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b808202811582820484141761069a5761069a614c56565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff818116838216019080821115614cd557614cd5614c56565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261517d8184018a6142ed565b9050828103608084015261519181896142ed565b905060ff871660a084015282810360c08401526151ae8187614076565b905067ffffffffffffffff851660e08401528281036101008401526151d38185614076565b9c9b505050505050505050505050565b805161124281614ddd565b60006020828403121561520057600080fd5b8151613df481614ddd565b600181815b8085111561526457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561524a5761524a614c56565b8085161561525757918102915b93841c9390800290615210565b509250929050565b60008261527b5750600161069a565b816152885750600061069a565b816001811461529e57600281146152a8576152c4565b600191505061069a565b60ff8411156152b9576152b9614c56565b50506001821b61069a565b5060208310610133831016604e8410600b84101617156152e7575081810a61069a565b6152f1838361520b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561532357615323614c56565b029392505050565b6000613df460ff84168361526c565b60008261534957615349614c27565b500490565b6bffffffffffffffffffffffff818116838216019080821115614cd557614cd5614c56565b6bffffffffffffffffffffffff81811683821602808216919082811461487f5761487f614c56565b8082018082111561069a5761069a614c56565b67ffffffffffffffff818116838216019080821115614cd557614cd5614c56565b600082601f8301126153e057600080fd5b813560206153f061493c836148f7565b82815260059290921b8401810191818101908684111561540f57600080fd5b8286015b848110156149845780358352918301918301615413565b600082601f83011261543b57600080fd5b8135602061544b61493c836148f7565b82815260059290921b8401810191818101908684111561546a57600080fd5b8286015b8481101561498457803567ffffffffffffffff81111561548e5760008081fd5b61549c8986838b010161419f565b84525091830191830161546e565b600080600080600060a086880312156154c257600080fd5b853567ffffffffffffffff808211156154da57600080fd5b6154e689838a016153cf565b965060208801359150808211156154fc57600080fd5b61550889838a0161542a565b9550604088013591508082111561551e57600080fd5b61552a89838a0161542a565b9450606088013591508082111561554057600080fd5b61554c89838a0161542a565b9350608088013591508082111561556257600080fd5b5061556f8882890161542a565b9150509295509295909350565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526155c38285018b6142ed565b915083820360808501526155d7828a6142ed565b915060ff881660a085015283820360c08501526155f48288614076565b90861660e085015283810361010085015290506151d38185614076565b805161124281614262565b80516112428161428f565b805161124281614617565b8051611242816145ca565b8051611242816145e7565b6000610160828403121561565b57600080fd5b61566361412c565b8251815261567360208401615611565b60208201526156846040840161561c565b604082015261569560608401615611565b60608201526156a660808401615627565b60808201526156b760a08401615632565b60a08201526156c860c084016151e3565b60c08201526156d960e084016151e3565b60e08201526101006156ec81850161563d565b908201526101206156fe84820161563d565b9082015261014061475f848201615632565b64ffffffffff818116838216019080821115614cd557614cd5614c56565b60006102008083526157428184018a614076565b905082810360208401526157568189614076565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff86166080850152915061579f905060a08301846143a6565b979650505050505050565b600080604083850312156157bd57600080fd5b8251600781106157cc57600080fd5b60208401519092506142e28161428f565b6000602082840312156157ef57600080fd5b5051919050565b60008351615808818460208801614052565b83519083019061581c818360208801614052565b01949350505050565b60006020828403121561583757600080fd5b8151613df48161426256fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a", + Bin: "0x60a06040523480156200001157600080fd5b506040516200603a3803806200603a8339810160408190526200003491620004db565b83838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200014e565b5050506001600160a01b038116620000ee57604051632530e88560e11b815260040160405180910390fd5b6001600160a01b03908116608052600c80546001600160601b03166c0100000000000000000000000085841602179055600d80546001600160a01b0319169183169190911790556200014083620001f9565b505050505050505062000742565b336001600160a01b03821603620001a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620002036200039e565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff16600160f81b026001600160f81b036001600160401b03909216600160b81b02919091166001600160b81b0361ffff938416600160a81b0261ffff60a81b1964ffffffffff909616600160801b029590951666ffffffffffffff60801b1963ffffffff9788166c010000000000000000000000000263ffffffff60601b19998916680100000000000000000299909916600160401b600160801b03199b8916640100000000026001600160401b0319909d169e89169e909e179b909b17999099169b909b1795909517979097169590951717969096161792909217909255610100840151610120850151909316600160e01b026001600160e01b0390931692909217600955610140830151600a80546101608601518416620100000263ffffffff19919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a906200039390839062000639565b60405180910390a150565b620003a8620003aa565b565b6000546001600160a01b03163314620003a85760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000087565b80516001600160a01b03811681146200041e57600080fd5b919050565b60405161018081016001600160401b03811182821017156200045557634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff811681146200041e57600080fd5b805164ffffffffff811681146200041e57600080fd5b805161ffff811681146200041e57600080fd5b80516001600160401b03811681146200041e57600080fd5b805160ff811681146200041e57600080fd5b80516001600160e01b03811681146200041e57600080fd5b6000806000808486036101e0811215620004f457600080fd5b620004ff8662000406565b945061018080601f19830112156200051657600080fd5b6200052062000423565b915062000530602088016200045b565b825262000540604088016200045b565b602083015262000553606088016200045b565b604083015262000566608088016200045b565b60608301526200057960a0880162000470565b60808301526200058c60c0880162000486565b60a08301526200059f60e0880162000499565b60c0830152610100620005b4818901620004b1565b60e0840152610120620005c9818a01620004c3565b828501526101409150620005df828a016200045b565b90840152610160620005f389820162000486565b8285015262000604838a0162000486565b90840152509093506200061d90506101a0860162000406565b91506200062e6101c0860162000406565b905092959194509250565b815163ffffffff1681526101808101602083015162000660602084018263ffffffff169052565b50604083015162000679604084018263ffffffff169052565b50606083015162000692606084018263ffffffff169052565b506080830151620006ac608084018264ffffffffff169052565b5060a0830151620006c360a084018261ffff169052565b5060c0830151620006df60c08401826001600160401b03169052565b5060e0830151620006f560e084018260ff169052565b50610100838101516001600160e01b0316908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101609384015116929091019190915290565b6080516158b2620007886000396000818161079c01528181610c7d01528181610f110152818161102701528181611b2d015281816129eb015261398401526158b26000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638da5cb5b116100ee578063d227d24511610097578063e4ddcea611610071578063e4ddcea6146105d5578063f2f22ef1146105eb578063f2fde38b146105f3578063f6ea41f61461060657600080fd5b8063d227d2451461058a578063d328a91e146105ba578063e3d0e712146105c257600080fd5b8063b1dc65a4116100c8578063b1dc65a414610396578063ba9c924d146103a9578063c3f909d4146103bc57600080fd5b80638da5cb5b1461032e578063a631571e14610356578063afcb95d71461037657600080fd5b80637d4807871161015057806381f1b9381161012a57806381f1b938146102a657806381ff7048146102ae57806385b214cf1461031b57600080fd5b80637d480787146102765780637f15e1661461027e578063814118341461029157600080fd5b806366316d8d1161018157806366316d8d1461023c5780637212762f1461024f57806379ba50971461026e57600080fd5b8063083a5466146101a8578063181f5a77146101bd578063626f458c1461020f575b600080fd5b6101bb6101b636600461402b565b61060e565b005b6101f96040518060400160405280601c81526020017f46756e6374696f6e7320436f6f7264696e61746f722076312e332e300000000081525081565b60405161020691906140db565b60405180910390f35b61022261021d366004614248565b610663565b60405168ffffffffffffffffff9091168152602001610206565b6101bb61024a3660046142cf565b6106a0565b610257610859565b6040805192835260ff909116602083015201610206565b6101bb610a6c565b6101bb610b69565b6101bb61028c36600461402b565b610d69565b610299610db9565b6040516102069190614359565b6101f9610e28565b6102f860015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610206565b6101bb61032936600461436c565b610ef9565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b610369610364366004614385565b610fb6565b60405161020691906144da565b604080516001815260006020820181905291810191909152606001610206565b6101bb6103a436600461452e565b611247565b6101bb6103b7366004614699565b61185e565b61057d6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915250604080516101808101825260085463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830152700100000000000000000000000000000000810464ffffffffff1660808301527501000000000000000000000000000000000000000000810461ffff90811660a084015277010000000000000000000000000000000000000000000000820467ffffffffffffffff1660c08401527f010000000000000000000000000000000000000000000000000000000000000090910460ff1660e08301526009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166101008401527c01000000000000000000000000000000000000000000000000000000009004909216610120820152600a5480831661014083015262010000900490911661016082015290565b6040516102069190614785565b61059d6105983660046148a2565b611b29565b6040516bffffffffffffffffffffffff9091168152602001610206565b6101f9611c97565b6101bb6105d03660046149aa565b611cee565b6105dd61286a565b604051908152602001610206565b6102226129ae565b6101bb610601366004614a77565b6129d3565b6102226129e7565b610616612a78565b6000819003610651576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f61065e828483614b27565b505050565b600a5460009061069a9060649061067d9061ffff16612afb565b6106879190614ca0565b6bffffffffffffffffffffffff16612b48565b92915050565b6106a8612be7565b806bffffffffffffffffffffffff166000036106e25750336000908152600b60205260409020546bffffffffffffffffffffffff1661073c565b336000908152600b60205260409020546bffffffffffffffffffffffff8083169116101561073c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b6020526040812080548392906107699084906bffffffffffffffffffffffff16614ccb565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506107be7f000000000000000000000000000000000000000000000000000000000000000090565b6040517f66316d8d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526bffffffffffffffffffffffff8416602483015291909116906366316d8d90604401600060405180830381600087803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b505050505050565b600080600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614d11565b5093505092505080426109039190614d61565b600854640100000000900463ffffffff161080156109305750600854640100000000900463ffffffff1615155b1561098d57505060085477010000000000000000000000000000000000000000000000810467ffffffffffffffff16937f010000000000000000000000000000000000000000000000000000000000000090910460ff1692509050565b600082136109cf576040517f56b22ab8000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600d54604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051849273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a629190614d74565b9350935050509091565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b71612dae565b610b79612be7565b6000610b83610db9565b905060005b8151811015610d65576000600b6000848481518110610ba957610ba9614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252810191909152604001600020546bffffffffffffffffffffffff1690508015610d54576000600b6000858581518110610c0857610c08614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610c9f7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166366316d8d848481518110610ccc57610ccc614d91565b6020026020010151836040518363ffffffff1660e01b8152600401610d2192919073ffffffffffffffffffffffffffffffffffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050505b50610d5e81614dc0565b9050610b88565b5050565b610d71612a78565b6000819003610dac576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e61065e828483614b27565b60606006805480602002602001604051908101604052809291908181526020018280548015610e1e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df3575b5050505050905090565b6060600f8054610e3790614a94565b9050600003610e72576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f8054610e7f90614a94565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90614a94565b8015610e1e5780601f10610ecd57610100808354040283529160200191610e1e565b820191906000526020600020905b815481529060010190602001808311610edb57509395945050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f68576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526007602052604080822091909155517f8a4b97add3359bd6bcf5e82874363670eb5ad0f7615abddbd0ed0a3a98f0f41690610fab9083815260200190565b60405180910390a150565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091523373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461107e576040517fc41a5b0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061109161108c84614e1a565b612db6565b90925090506110a66060840160408501614a77565b825173ffffffffffffffffffffffffffffffffffffffff91909116907fbf50768ccf13bd0110ca6d53a9c4f1f3271abdd4c24a56878863ed25b20598ff326110f460c0880160a08901614f07565b61110661016089016101408a01614a77565b6111108980614f24565b6111226101208c016101008d01614f89565b60208c01356111386101008e0160e08f01614fa4565b6040518061016001604052808e6000015181526020018e6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018e604001516bffffffffffffffffffffffff1681526020018e6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6080015167ffffffffffffffff1681526020018e60a0015163ffffffff1681526020018d68ffffffffffffffffff1681526020018e60e0015168ffffffffffffffffff1681526020018e610100015164ffffffffff1681526020018e610120015164ffffffffff1681526020018e610140015163ffffffff1681525060405161123899989796959493929190614fc1565b60405180910390a3505b919050565b6000806112548989613168565b915091508115611265575050611854565b604080518b3580825262ffffff6020808f0135600881901c9290921690840152909290917fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a16112c28b8b8b8b8b8b6132f1565b6003546000906002906112e09060ff80821691610100900416615077565b6112ea9190615090565b6112f5906001615077565b60ff169050888114611363576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f77726f6e67206e756d626572206f66207369676e61747572657300000000000060448201526064016109c6565b8887146113f2576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f7265706f727420727320616e64207373206d757374206265206f66206571756160448201527f6c206c656e67746800000000000000000000000000000000000000000000000060648201526084016109c6565b3360009081526004602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611435576114356150b2565b6002811115611446576114466150b2565b9052509050600281602001516002811115611463576114636150b2565b141580156114ac57506006816000015160ff168154811061148657611486614d91565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff163314155b15611513576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f756e617574686f72697a6564207472616e736d6974746572000000000000000060448201526064016109c6565b5050505061151f613fca565b60008a8a6040516115319291906150e1565b604051908190038120611548918e906020016150f1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120838301909252600080845290830152915060005b898110156118445760006001848984602081106115b1576115b1614d91565b6115be91901a601b615077565b8e8e868181106115d0576115d0614d91565b905060200201358d8d878181106115e9576115e9614d91565b9050602002013560405160008152602001604052604051611626949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611648573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526004602090815290849020838501909452835460ff808216855292965092945084019161010090041660028111156116c8576116c86150b2565b60028111156116d9576116d96150b2565b90525092506001836020015160028111156116f6576116f66150b2565b1461175d576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e000060448201526064016109c6565b8251600090869060ff16601f811061177757611777614d91565b602002015173ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e6f6e2d756e69717565207369676e617475726500000000000000000000000060448201526064016109c6565b8085846000015160ff16601f811061181357611813614d91565b73ffffffffffffffffffffffffffffffffffffffff90921660209290920201525061183d81614dc0565b9050611592565b505050611850826133a8565b5050505b5050505050505050565b611866612dae565b80516008805460208401516040808601516060870151608088015160a089015160c08a015160e08b015160ff167f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff90921677010000000000000000000000000000000000000000000000029190911676ffffffffffffffffffffffffffffffffffffffffffffff61ffff9384167501000000000000000000000000000000000000000000027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff64ffffffffff90961670010000000000000000000000000000000002959095167fffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff63ffffffff9788166c01000000000000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff9989166801000000000000000002999099167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9b8916640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909d169e89169e909e179b909b17999099169b909b17959095179790971695909517179690961617929092179092556101008401516101208501519093167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217600955610140830151600a8054610160860151841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000919091169290931691909117919091179055517f2e2c8535dcc25459d519f2300c114d2d2128bf6399722d04eca078461a3bf33a90610fab908390614785565b60007f00000000000000000000000000000000000000000000000000000000000000006040517f10fc49c100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015263ffffffff8516602482015273ffffffffffffffffffffffffffffffffffffffff91909116906310fc49c19060440160006040518083038186803b158015611bc957600080fd5b505afa158015611bdd573d6000803e3d6000fd5b5050505066038d7ea4c68000821115611c22576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2c6129e7565b90506000611c6f87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066392505050565b90506000611c7b6129ae565b9050611c8a86868486856134f7565b9998505050505050505050565b6060600e8054611ca690614a94565b9050600003611ce1576040517f4f42be3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054610e7f90614a94565b855185518560ff16601f831115611d61576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e6572730000000000000000000000000000000060448201526064016109c6565b80600003611dcb576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016109c6565b818314611e59576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109c6565b611e64816003615105565b8311611ecc576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f2068696768000000000000000060448201526064016109c6565b611ed4612a78565b6040805160c0810182528a8152602081018a905260ff89169181018290526060810188905267ffffffffffffffff8716608082015260a0810186905290611f1b9088613673565b600554156120d057600554600090611f3590600190614d61565b9050600060058281548110611f4c57611f4c614d91565b60009182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff90921693509084908110611f8657611f86614d91565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff85811684526004909252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155929091168084529220805490911690556005805491925090806120065761200661511c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055600680548061206f5761206f61511c565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611f1b915050565b60005b815151811015612687578151805160009190839081106120f5576120f5614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361217a576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7369676e6572206d757374206e6f7420626520656d707479000000000000000060448201526064016109c6565b600073ffffffffffffffffffffffffffffffffffffffff16826020015182815181106121a8576121a8614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361222d576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e736d6974746572206d757374206e6f7420626520656d70747900000060448201526064016109c6565b6000600460008460000151848151811061224957612249614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff166002811115612293576122936150b2565b146122fa576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265706561746564207369676e6572206164647265737300000000000000000060448201526064016109c6565b6040805180820190915260ff8216815260016020820152825180516004916000918590811061232b5761232b614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156123cc576123cc6150b2565b0217905550600091506123dc9050565b60046000846020015184815181106123f6576123f6614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002054610100900460ff166002811115612440576124406150b2565b146124a7576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016109c6565b6040805180820190915260ff8216815260208101600281525060046000846020015184815181106124da576124da614d91565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561257b5761257b6150b2565b02179055505082518051600592508390811061259957612599614d91565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558201518051600691908390811061261557612615614d91565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790558061267f81614dc0565b9150506120d3565b506040810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff438116820292909217808555920481169291829160149161273f9184917401000000000000000000000000000000000000000090041661514b565b92506101000a81548163ffffffff021916908363ffffffff16021790555061279e4630600160149054906101000a900463ffffffff1663ffffffff16856000015186602001518760400151886060015189608001518a60a0015161368c565b600281905582518051600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff9093169290920291909117905560015460208501516040808701516060880151608089015160a08a015193517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0598612855988b9891977401000000000000000000000000000000000000000090920463ffffffff16969095919491939192615168565b60405180910390a15050505050505050505050565b6000806000600c8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156128da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fe9190614d11565b5093505092505080426129119190614d61565b600854640100000000900463ffffffff1610801561293e5750600854640100000000900463ffffffff1615155b1561296b5750506009547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b600082136129a8576040517f43d4cf66000000000000000000000000000000000000000000000000000000008152600481018390526024016109c6565b50919050565b600a546000906129ce9060649061067d9062010000900461ffff16612afb565b905090565b6129db612a78565b6129e481613737565b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a905ccc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615209565b60005473ffffffffffffffffffffffffffffffffffffffff163314612af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c6565b565b6000806000612b08610859565b9092509050612b4082612b1c836012615077565b612b2790600a615346565b612b319087615105565b612b3b9190615355565b61382c565b949350505050565b600068ffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203760448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b5090565b600c546bffffffffffffffffffffffff16600003612c0157565b6000612c0b610db9565b80519091506000819003612c4b576040517f30274b3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600090612c6a9083906bffffffffffffffffffffffff16614ca0565b9050806bffffffffffffffffffffffff16600003612c8757505050565b60005b82811015612d505781600b6000868481518110612ca957612ca9614d91565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046bffffffffffffffffffffffff16612d119190615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080612d4990614dc0565b9050612c8a565b50612d5b828261538e565b600c8054600090612d7b9084906bffffffffffffffffffffffff16614ccb565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505050565b612af9612a78565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915260085461010083015160009161ffff7501000000000000000000000000000000000000000000909104811691161115612e74576040517fdada758700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e838460000151610663565b9050612e8d6129ae565b91506000612ea68560e001513a848860800151876134f7565b9050806bffffffffffffffffffffffff1685606001516bffffffffffffffffffffffff161015612f02576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600090612f38907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16426153b6565b905060003087604001518860a001518960c001516001612f5891906153c9565b8a5180516020918201206101008d015160e08e015160405161300c98979695948c918c9132910173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a015267ffffffffffffffff97881660408a0152959096166060880152608087019390935261ffff9190911660a086015263ffffffff90811660c08601526bffffffffffffffffffffffff9190911660e0850152919091166101008301529091166101208201526101400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206101608401835280845230848301526bffffffffffffffffffffffff8716848401528a83015173ffffffffffffffffffffffffffffffffffffffff16606085015260a0808c015167ffffffffffffffff1660808087019190915260e0808e015163ffffffff90811693880193909352908d015168ffffffffffffffffff90811660c08801528a169086015260085468010000000000000000810482166101008701526c010000000000000000000000009004811661012086015286166101408501529151929850909250613118918891016144da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600093845260079092529091205550929491935090915050565b600061319c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000808080806131ae888a018a6154c5565b84519499509297509095509350915060ff168015806131ce575084518114155b806131da575083518114155b806131e6575082518114155b806131f2575081518114155b15613259576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4669656c6473206d75737420626520657175616c206c656e677468000000000060448201526064016109c6565b60005b818110156132bf5761329587828151811061327957613279614d91565b6020026020010151600090815260076020526040902054151590565b6132bf576132a4600183614d61565b81036132af57600198505b6132b881614dc0565b905061325c565b50506040805160a0810182529586526020860194909452928401919091526060830152608082015290505b9250929050565b60006132fe826020615105565b613309856020615105565b613315886101446153b6565b61331f91906153b6565b61332991906153b6565b6133349060006153b6565b905036811461339f576040517f660bd4ba00000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616c6c64617461206c656e677468206d69736d61746368000000000000000060448201526064016109c6565b50505050505050565b80515160ff1660005b8181101561065e57600061345a846000015183815181106133d4576133d4614d91565b6020026020010151856020015184815181106133f2576133f2614d91565b60200260200101518660400151858151811061341057613410614d91565b60200260200101518760600151868151811061342e5761342e614d91565b60200260200101518860800151878151811061344c5761344c614d91565b6020026020010151886138ca565b90506000816006811115613470576134706150b2565b148061348d5750600181600681111561348b5761348b6150b2565b145b156134e65783518051839081106134a6576134a6614d91565b60209081029190910181015160405133815290917fc708e0440951fd63499c0f7a73819b469ee5dd3ecc356c0ab4eb7f18389009d9910160405180910390a25b506134f081614dc0565b90506133b1565b600854600090700100000000000000000000000000000000900464ffffffffff1685101561354057600854700100000000000000000000000000000000900464ffffffffff1694505b6008546000906127109061355a9063ffffffff1688615105565b6135649190615355565b61356e90876153b6565b60085490915060009088906135a79063ffffffff6c0100000000000000000000000082048116916801000000000000000090041661514b565b6135b1919061514b565b63ffffffff16905060006135fb6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d8e92505050565b9050600061361c8261360d8587615105565b61361791906153b6565b613ed0565b905060008668ffffffffffffffffff168868ffffffffffffffffff168a68ffffffffffffffffff1661364e9190615369565b6136589190615369565b90506136648183615369565b9b9a5050505050505050505050565b600061367d610db9565b511115610d6557610d65612be7565b6000808a8a8a8a8a8a8a8a8a6040516020016136b099989796959493929190615597565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036137b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006bffffffffffffffffffffffff821115612be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201527f362062697473000000000000000000000000000000000000000000000000000060648201526084016109c6565b600080848060200190518101906138e19190615663565b905060003a8261012001518361010001516138fc919061572b565b64ffffffffff1661390d9190615105565b905060008460ff166139556000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d8e92505050565b61395f9190615355565b9050600061397061361783856153b6565b9050600061397d3a613ed0565b90506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663330605298e8e868b60c0015168ffffffffffffffffff168c60e0015168ffffffffffffffffff168a6139ec9190615369565b6139f69190615369565b336040518061016001604052808f6000015181526020018f6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018f604001516bffffffffffffffffffffffff1681526020018f6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018f6080015167ffffffffffffffff1681526020018f60a0015163ffffffff168152602001600068ffffffffffffffffff1681526020018f60e0015168ffffffffffffffffff1681526020018f610100015164ffffffffff1681526020018f610120015164ffffffffff1681526020018f610140015163ffffffff168152506040518763ffffffff1660e01b8152600401613b0496959493929190615749565b60408051808303816000875af1158015613b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4691906157c5565b90925090506000826006811115613b5f57613b5f6150b2565b1480613b7c57506001826006811115613b7a57613b7a6150b2565b145b15613d7d5760008e815260076020526040812055613b9a8185615369565b336000908152600b602052604081208054909190613bc79084906bffffffffffffffffffffffff16615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660e0015168ffffffffffffffffff16600c60008282829054906101000a90046bffffffffffffffffffffffff16613c2d9190615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508660c0015168ffffffffffffffffff16600b6000613c77613eef565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190613cbd9084906bffffffffffffffffffffffff16615369565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508d7f08a4a0761e3c98d288cb4af9342660f49550d83139fb3b762b70d34bed6273688487848b60e0015160008d60c00151604051613d74969594939291906bffffffffffffffffffffffff9687168152602081019590955292909416604084015268ffffffffffffffffff9081166060840152928316608083015290911660a082015260c00190565b60405180910390a25b509c9b505050505050505050505050565b600046613d9a81613f60565b15613e1657606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0f91906157f8565b9392505050565b613e1f81613f83565b15613ec75773420000000000000000000000000000000000000f73ffffffffffffffffffffffffffffffffffffffff166349948e0e8460405180608001604052806048815260200161585e60489139604051602001613e7f929190615811565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613eaa91906140db565b602060405180830381865afa158015613deb573d6000803e3d6000fd5b50600092915050565b600061069a613edd61286a565b612b3184670de0b6b3a7640000615105565b60003073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190615840565b600061a4b1821480613f74575062066eed82145b8061069a57505062066eee1490565b6000600a821480613f9557506101a482145b80613fa2575062aa37dc82145b80613fae575061210582145b80613fbb575062014a3382145b8061069a57505062014a341490565b604051806103e00160405280601f906020820280368337509192915050565b60008083601f840112613ffb57600080fd5b50813567ffffffffffffffff81111561401357600080fd5b6020830191508360208285010111156132ea57600080fd5b6000806020838503121561403e57600080fd5b823567ffffffffffffffff81111561405557600080fd5b61406185828601613fe9565b90969095509350505050565b60005b83811015614088578181015183820152602001614070565b50506000910152565b600081518084526140a981602086016020860161406d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e0f6020830184614091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610180810167ffffffffffffffff81118282101715614141576141416140ee565b60405290565b604051610160810167ffffffffffffffff81118282101715614141576141416140ee565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156141b2576141b26140ee565b604052919050565b600082601f8301126141cb57600080fd5b813567ffffffffffffffff8111156141e5576141e56140ee565b61421660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161416b565b81815284602083860101111561422b57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561425a57600080fd5b813567ffffffffffffffff81111561427157600080fd5b612b40848285016141ba565b73ffffffffffffffffffffffffffffffffffffffff811681146129e457600080fd5b80356112428161427d565b6bffffffffffffffffffffffff811681146129e457600080fd5b8035611242816142aa565b600080604083850312156142e257600080fd5b82356142ed8161427d565b915060208301356142fd816142aa565b809150509250929050565b600081518084526020808501945080840160005b8381101561434e57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161431c565b509495945050505050565b602081526000613e0f6020830184614308565b60006020828403121561437e57600080fd5b5035919050565b60006020828403121561439757600080fd5b813567ffffffffffffffff8111156143ae57600080fd5b82016101608185031215613e0f57600080fd5b8051825260208101516143ec602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604081015161440c60408401826bffffffffffffffffffffffff169052565b506060810151614434606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080810151614450608084018267ffffffffffffffff169052565b5060a081015161446860a084018263ffffffff169052565b5060c081015161448560c084018268ffffffffffffffffff169052565b5060e08101516144a260e084018268ffffffffffffffffff169052565b506101008181015164ffffffffff9081169184019190915261012080830151909116908301526101409081015163ffffffff16910152565b610160810161069a82846143c1565b60008083601f8401126144fb57600080fd5b50813567ffffffffffffffff81111561451357600080fd5b6020830191508360208260051b85010111156132ea57600080fd5b60008060008060008060008060e0898b03121561454a57600080fd5b606089018a81111561455b57600080fd5b8998503567ffffffffffffffff8082111561457557600080fd5b6145818c838d01613fe9565b909950975060808b013591508082111561459a57600080fd5b6145a68c838d016144e9565b909750955060a08b01359150808211156145bf57600080fd5b506145cc8b828c016144e9565b999c989b50969995989497949560c00135949350505050565b63ffffffff811681146129e457600080fd5b8035611242816145e5565b64ffffffffff811681146129e457600080fd5b803561124281614602565b803561ffff8116811461124257600080fd5b67ffffffffffffffff811681146129e457600080fd5b803561124281614632565b60ff811681146129e457600080fd5b803561124281614653565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461124257600080fd5b600061018082840312156146ac57600080fd5b6146b461411d565b6146bd836145f7565b81526146cb602084016145f7565b60208201526146dc604084016145f7565b60408201526146ed606084016145f7565b60608201526146fe60808401614615565b608082015261470f60a08401614620565b60a082015261472060c08401614648565b60c082015261473160e08401614662565b60e082015261010061474481850161466d565b908201526101206147568482016145f7565b90820152610140614768848201614620565b9082015261016061477a848201614620565b908201529392505050565b815163ffffffff168152610180810160208301516147ab602084018263ffffffff169052565b5060408301516147c3604084018263ffffffff169052565b5060608301516147db606084018263ffffffff169052565b5060808301516147f4608084018264ffffffffff169052565b5060a083015161480a60a084018261ffff169052565b5060c083015161482660c084018267ffffffffffffffff169052565b5060e083015161483b60e084018260ff169052565b50610100838101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16908301526101208084015163ffffffff16908301526101408084015161ffff908116918401919091526101608085015191821681850152905b505092915050565b6000806000806000608086880312156148ba57600080fd5b85356148c581614632565b9450602086013567ffffffffffffffff8111156148e157600080fd5b6148ed88828901613fe9565b9095509350506040860135614901816145e5565b949793965091946060013592915050565b600067ffffffffffffffff82111561492c5761492c6140ee565b5060051b60200190565b600082601f83011261494757600080fd5b8135602061495c61495783614912565b61416b565b82815260059290921b8401810191818101908684111561497b57600080fd5b8286015b8481101561499f5780356149928161427d565b835291830191830161497f565b509695505050505050565b60008060008060008060c087890312156149c357600080fd5b863567ffffffffffffffff808211156149db57600080fd5b6149e78a838b01614936565b975060208901359150808211156149fd57600080fd5b614a098a838b01614936565b9650614a1760408a01614662565b95506060890135915080821115614a2d57600080fd5b614a398a838b016141ba565b9450614a4760808a01614648565b935060a0890135915080821115614a5d57600080fd5b50614a6a89828a016141ba565b9150509295509295509295565b600060208284031215614a8957600080fd5b8135613e0f8161427d565b600181811c90821680614aa857607f821691505b6020821081036129a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561065e57600081815260208120601f850160051c81016020861015614b085750805b601f850160051c820191505b8181101561085157828155600101614b14565b67ffffffffffffffff831115614b3f57614b3f6140ee565b614b5383614b4d8354614a94565b83614ae1565b6000601f841160018114614ba55760008515614b6f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614c3b565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614bf45786850135825560209485019460019092019101614bd4565b5086821015614c2f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006bffffffffffffffffffffffff80841680614cbf57614cbf614c42565b92169190910492915050565b6bffffffffffffffffffffffff828116828216039080821115614cf057614cf0614c71565b5092915050565b805169ffffffffffffffffffff8116811461124257600080fd5b600080600080600060a08688031215614d2957600080fd5b614d3286614cf7565b9450602086015193506040860151925060608601519150614d5560808701614cf7565b90509295509295909350565b8181038181111561069a5761069a614c71565b600060208284031215614d8657600080fd5b8151613e0f81614653565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614df157614df1614c71565b5060010190565b68ffffffffffffffffff811681146129e457600080fd5b803561124281614df8565b60006101608236031215614e2d57600080fd5b614e35614147565b823567ffffffffffffffff811115614e4c57600080fd5b614e58368286016141ba565b82525060208301356020820152614e716040840161429f565b6040820152614e82606084016142c4565b6060820152614e9360808401614e0f565b6080820152614ea460a08401614648565b60a0820152614eb560c08401614648565b60c0820152614ec660e084016145f7565b60e0820152610100614ed9818501614620565b90820152610120614eeb848201614648565b90820152610140614efd84820161429f565b9082015292915050565b600060208284031215614f1957600080fd5b8135613e0f81614632565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f5957600080fd5b83018035915067ffffffffffffffff821115614f7457600080fd5b6020019150368190038213156132ea57600080fd5b600060208284031215614f9b57600080fd5b613e0f82614620565b600060208284031215614fb657600080fd5b8135613e0f816145e5565b73ffffffffffffffffffffffffffffffffffffffff8a8116825267ffffffffffffffff8a166020830152881660408201526102406060820181905281018690526000610260878982850137600083890182015261ffff8716608084015260a0830186905263ffffffff851660c0840152601f88017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016830101905061506960e08301846143c1565b9a9950505050505050505050565b60ff818116838216019081111561069a5761069a614c71565b600060ff8316806150a3576150a3614c42565b8060ff84160491505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8183823760009101908152919050565b828152606082602083013760800192915050565b808202811582820484141761069a5761069a614c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b63ffffffff818116838216019080821115614cf057614cf0614c71565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526151988184018a614308565b905082810360808401526151ac8189614308565b905060ff871660a084015282810360c08401526151c98187614091565b905067ffffffffffffffff851660e08401528281036101008401526151ee8185614091565b9c9b505050505050505050505050565b805161124281614df8565b60006020828403121561521b57600080fd5b8151613e0f81614df8565b600181815b8085111561527f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561526557615265614c71565b8085161561527257918102915b93841c939080029061522b565b509250929050565b6000826152965750600161069a565b816152a35750600061069a565b81600181146152b957600281146152c3576152df565b600191505061069a565b60ff8411156152d4576152d4614c71565b50506001821b61069a565b5060208310610133831016604e8410600b8410161715615302575081810a61069a565b61530c8383615226565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561533e5761533e614c71565b029392505050565b6000613e0f60ff841683615287565b60008261536457615364614c42565b500490565b6bffffffffffffffffffffffff818116838216019080821115614cf057614cf0614c71565b6bffffffffffffffffffffffff81811683821602808216919082811461489a5761489a614c71565b8082018082111561069a5761069a614c71565b67ffffffffffffffff818116838216019080821115614cf057614cf0614c71565b600082601f8301126153fb57600080fd5b8135602061540b61495783614912565b82815260059290921b8401810191818101908684111561542a57600080fd5b8286015b8481101561499f578035835291830191830161542e565b600082601f83011261545657600080fd5b8135602061546661495783614912565b82815260059290921b8401810191818101908684111561548557600080fd5b8286015b8481101561499f57803567ffffffffffffffff8111156154a95760008081fd5b6154b78986838b01016141ba565b845250918301918301615489565b600080600080600060a086880312156154dd57600080fd5b853567ffffffffffffffff808211156154f557600080fd5b61550189838a016153ea565b9650602088013591508082111561551757600080fd5b61552389838a01615445565b9550604088013591508082111561553957600080fd5b61554589838a01615445565b9450606088013591508082111561555b57600080fd5b61556789838a01615445565b9350608088013591508082111561557d57600080fd5b5061558a88828901615445565b9150509295509295909350565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526155de8285018b614308565b915083820360808501526155f2828a614308565b915060ff881660a085015283820360c085015261560f8288614091565b90861660e085015283810361010085015290506151ee8185614091565b80516112428161427d565b8051611242816142aa565b805161124281614632565b8051611242816145e5565b805161124281614602565b6000610160828403121561567657600080fd5b61567e614147565b8251815261568e6020840161562c565b602082015261569f60408401615637565b60408201526156b06060840161562c565b60608201526156c160808401615642565b60808201526156d260a0840161564d565b60a08201526156e360c084016151fe565b60c08201526156f460e084016151fe565b60e0820152610100615707818501615658565b90820152610120615719848201615658565b9082015261014061477a84820161564d565b64ffffffffff818116838216019080821115614cf057614cf0614c71565b600061020080835261575d8184018a614091565b905082810360208401526157718189614091565b6bffffffffffffffffffffffff88811660408601528716606085015273ffffffffffffffffffffffffffffffffffffffff8616608085015291506157ba905060a08301846143c1565b979650505050505050565b600080604083850312156157d857600080fd5b8251600781106157e757600080fd5b60208401519092506142fd816142aa565b60006020828403121561580a57600080fd5b5051919050565b6000835161582381846020880161406d565b83519083019061583781836020880161406d565b01949350505050565b60006020828403121561585257600080fd5b8151613e0f8161427d56fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a", } var FunctionsCoordinatorABI = FunctionsCoordinatorMetaData.ABI diff --git a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 3bb99476d9a..bf74137743e 100644 --- a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,10 +1,10 @@ GETH_VERSION: 1.13.14 functions: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.bin 3c972870b0afeb6d73a29ebb182f24956a2cebb127b21c4f867d1ecf19a762db -functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 0c2156289e11f884ca6e92bf851192d3917c9094a0a301bcefa61266678d0e57 +functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 268de8b3c061b53a1a2a1ccc0149eff68545959e29cd41b5f2e9f5dab19075cf functions_billing_registry_events_mock: ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.abi ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.bin 50deeb883bd9c3729702be335c0388f9d8553bab4be5e26ecacac496a89e2b77 functions_client: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.bin 2368f537a04489c720a46733f8596c4fc88a31062ecfa966d05f25dd98608aca functions_client_example: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.bin abf32e69f268f40e8530eb8d8e96bf310b798a4c0049a58022d9d2fb527b601b -functions_coordinator: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.bin 292d4742d039a154ed7875a0167c9725e2a90674ad9a05f152377819bb991082 +functions_coordinator: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsCoordinator.bin 97a625c7ce8c8c167faad5e532a5894a52af5dee722b2da7e7528f5eaa32a0fe functions_load_test_client: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsLoadTestClient.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsLoadTestClient.bin c8dbbd5ebb34435800d6674700068837c3a252db60046a14b0e61e829db517de functions_oracle_events_mock: ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsOracleEventsMock.abi ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsOracleEventsMock.bin 3ca70f966f8fe751987f0ccb50bebb6aa5be77e4a9f835d1ae99e0e9bfb7d52c functions_router: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRouter.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRouter.bin 1f6d18f9e0846ad74b37a0a6acef5942ab73ace1e84307f201899f69e732e776 diff --git a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 103c137fdb9..8a3ad8cb2fd 100644 --- a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.14 -channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin c90e29d9f1a885098982b6175e0447416431b28c605273c807694ac7141e9167 +channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin 4ae3e6ca866fdf48850d67c0c7a4bdaf4905c81a4e3ce5efb9ef9613a55d8454 channel_config_verifier_proxy: ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.abi ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.bin 655658e5f61dfadfe3268de04f948b7e690ad03ca45676e645d6cd6018154661 channel_verifier: ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin e6020553bd8e3e6b250fcaffe7efd22aea955c8c1a0eb05d282fdeb0ab6550b7 errored_verifier: ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.bin a3e5a77262e13ee30fe8d35551b32a3452d71929e43fd780bbfefeaf4aa62e43 diff --git a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt index a30823b737f..1569801b3fb 100644 --- a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ -GETH_VERSION: 1.13.14 +GETH_VERSION: 1.13.8 authorized_forwarder: ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.abi ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.bin 8ea76c883d460f8353a45a493f2aebeb5a2d9a7b4619d1bc4fff5fb590bb3e10 authorized_receiver: ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.abi ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.bin 18e8969ba3234b027e1b16c11a783aca58d0ea5c2361010ec597f134b7bf1c4f link_token_receiver: ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.abi ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.bin 839552e2bea179bdf2591805422fb33769c1646d5a014a00fc2c0cd9c03ef229 From 29abe1745bc4ea558e426133e7a82b240a9f374c Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 18:53:21 -0700 Subject: [PATCH 21/30] Update types in vrf tests --- .../evm/forwarders/forwarder_manager_test.go | 16 +-- core/internal/cltest/cltest.go | 4 +- core/internal/features/features_test.go | 10 +- .../features/ocr2/features_ocr2_test.go | 13 +- .../fluxmonitorv2/integrations_test.go | 5 +- .../v1/internal/testutils.go | 17 +-- .../services/ocr2/plugins/llo/helpers_test.go | 3 +- .../ocr2/plugins/llo/integration_test.go | 7 +- .../ocr2/plugins/mercury/helpers_test.go | 4 +- .../ocr2/plugins/mercury/integration_test.go | 3 +- .../v21/logprovider/integration_test.go | 11 +- .../plugins/ocr2keeper/integration_21_test.go | 31 +++-- .../plugins/ocr2keeper/integration_test.go | 9 +- .../internal/ocr2vrf_integration_test.go | 9 +- .../relay/evm/functions/config_poller_test.go | 10 +- .../relay/evm/mercury/config_digest_test.go | 12 +- .../relay/evm/mercury/config_poller_test.go | 2 +- .../relay/evm/mercury/helpers_test.go | 14 +-- .../services/transmission/integration_test.go | 3 +- .../vrf_hash_to_curve_cost_test.go | 5 +- core/services/vrf/v2/bhs_feeder_test.go | 2 +- .../vrf/v2/integration_helpers_test.go | 20 ++-- .../vrf/v2/integration_v2_plus_test.go | 57 ++++----- .../v2/integration_v2_reverted_txns_test.go | 6 +- core/services/vrf/v2/integration_v2_test.go | 111 +++++++++--------- .../vrf/v2/listener_v2_log_listener_test.go | 13 +- core/services/vrf/vrftesthelpers/helpers.go | 18 +-- 27 files changed, 203 insertions(+), 212 deletions(-) diff --git a/core/chains/evm/forwarders/forwarder_manager_test.go b/core/chains/evm/forwarders/forwarder_manager_test.go index 3a515e7ab39..d9979565b48 100644 --- a/core/chains/evm/forwarders/forwarder_manager_test.go +++ b/core/chains/evm/forwarders/forwarder_manager_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" @@ -42,11 +42,11 @@ func TestFwdMgr_MaybeForwardTransaction(t *testing.T) { owner := testutils.MustNewSimTransactor(t) ctx := testutils.Context(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + ec := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)) t.Cleanup(func() { ec.Close() }) linkAddr := common.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709") operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, ec, linkAddr, owner.From) @@ -109,11 +109,11 @@ func TestFwdMgr_AccountUnauthorizedToForward_SkipsForwarding(t *testing.T) { cfg := configtest.NewTestGeneralConfig(t) evmcfg := evmtest.NewChainScopedConfig(t, cfg) owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + ec := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)) t.Cleanup(func() { ec.Close() }) linkAddr := common.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709") operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, ec, linkAddr, owner.From) diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go index f6a127a309d..ce336adf98f 100644 --- a/core/internal/cltest/cltest.go +++ b/core/internal/cltest/cltest.go @@ -18,9 +18,9 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/rpc" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -201,7 +201,7 @@ type TestApplication struct { Logger logger.Logger Server *httptest.Server Started bool - Backend *backends.SimulatedBackend + Backend *simulated.Backend Keys []ethkey.KeyV2 } diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go index 54a4a72c819..55169ef4ff9 100644 --- a/core/internal/features/features_test.go +++ b/core/internal/features/features_test.go @@ -18,7 +18,6 @@ import ( "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" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -41,6 +40,7 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" + "github.com/smartcontractkit/chainlink/v2/core/auth" "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" @@ -293,7 +293,7 @@ type OperatorContracts struct { multiWord *multiwordconsumer_wrapper.MultiWordConsumer singleWord *consumer_wrapper.Consumer operator *operator_wrapper.Operator - sim *backends.SimulatedBackend + sim *simulated.Backend } func setupOperatorContracts(t *testing.T) OperatorContracts { @@ -635,7 +635,7 @@ observationSource = """ }) } -func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBackend, common.Address, *offchainaggregator.OffchainAggregator, *flags_wrapper.Flags, common.Address) { +func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, common.Address, *offchainaggregator.OffchainAggregator, *flags_wrapper.Flags, common.Address) { owner := testutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000000", 10) // 1000 eth @@ -680,7 +680,7 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBac } func setupNode(t *testing.T, owner *bind.TransactOpts, portV2 int, - b *backends.SimulatedBackend, overrides func(c *chainlink.Config, s *chainlink.Secrets), + b *simulated.Backend, overrides func(c *chainlink.Config, s *chainlink.Secrets), ) (*cltest.TestApplication, string, common.Address, ocrkey.KeyV2) { ctx := testutils.Context(t) p2pKey := keystest.NewP2PKeyV2(t) @@ -726,7 +726,7 @@ func setupNode(t *testing.T, owner *bind.TransactOpts, portV2 int, return app, p2pKey.PeerID().Raw(), transmitter, key } -func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 int, b *backends.SimulatedBackend, overrides func(c *chainlink.Config, s *chainlink.Secrets)) (*cltest.TestApplication, string, common.Address, common.Address, ocrkey.KeyV2) { +func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 int, b *simulated.Backend, overrides func(c *chainlink.Config, s *chainlink.Secrets)) (*cltest.TestApplication, string, common.Address, common.Address, ocrkey.KeyV2) { ctx := testutils.Context(t) p2pKey := keystest.NewP2PKeyV2(t) config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { diff --git a/core/internal/features/ocr2/features_ocr2_test.go b/core/internal/features/ocr2/features_ocr2_test.go index 5e628a4d8d9..a210c4ad3be 100644 --- a/core/internal/features/ocr2/features_ocr2_test.go +++ b/core/internal/features/ocr2/features_ocr2_test.go @@ -17,11 +17,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" @@ -64,13 +63,13 @@ type ocr2Node struct { keybundle ocr2key.KeyBundle } -func setupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBackend, common.Address, *ocr2aggregator.OCR2Aggregator) { +func setupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, common.Address, *ocr2aggregator.OCR2Aggregator) { owner := testutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth - genesisData := core.GenesisAlloc{owner.From: {Balance: sb}} + genesisData := types.GenesisAlloc{owner.From: {Balance: sb}} gasLimit := ethconfig.Defaults.Miner.GasCeil * 2 - b := backends.NewSimulatedBackend(genesisData, gasLimit) + b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(gasLimit)) linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b) require.NoError(t, err) accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(owner, b) @@ -108,7 +107,7 @@ func setupNodeOCR2( owner *bind.TransactOpts, port int, useForwarder bool, - b *backends.SimulatedBackend, + b *simulated.Backend, p2pV2Bootstrappers []commontypes.BootstrapperLocator, ) *ocr2Node { ctx := testutils.Context(t) @@ -619,7 +618,7 @@ updateInterval = "1m" } } -func initOCR2(t *testing.T, lggr logger.Logger, b *backends.SimulatedBackend, +func initOCR2(t *testing.T, lggr logger.Logger, b *simulated.Backend, ocrContract *ocr2aggregator.OCR2Aggregator, owner *bind.TransactOpts, bootstrapNode *ocr2Node, diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index 84574242b73..cba665737ee 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -16,7 +16,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -70,7 +69,7 @@ type fluxAggregatorUniverse struct { flagsContractAddress common.Address evmChainID big.Int // Abstraction representation of the ethereum blockchain - backend *backends.SimulatedBackend + backend *simulated.Backend aggregatorABI abi.ABI // Cast of participants sergey *bind.TransactOpts // Owns all the LINK initially @@ -356,7 +355,7 @@ func submitAnswer(t *testing.T, p answerParams) { checkSubmission(t, p, cb.Int64(), 0) } -func awaitSubmission(t *testing.T, backend *backends.SimulatedBackend, submissionReceived chan *faw.FluxAggregatorSubmissionReceived) ( +func awaitSubmission(t *testing.T, backend *simulated.Backend, submissionReceived chan *faw.FluxAggregatorSubmissionReceived) ( receiptBlock uint64, answer int64, ) { t.Helper() diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index 3f96b49cfe0..29b4c76673d 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -29,6 +29,7 @@ import ( ocrtypes2 "github.com/smartcontractkit/libocr/offchainreporting2plus/types" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" @@ -58,7 +59,7 @@ func ptr[T any](v T) *T { return &v } var allowListPrivateKey = "0xae78c8b502571dba876742437f8bc78b689cf8518356c0921393d89caaf284ce" -func SetOracleConfig(t *testing.T, b *backends.SimulatedBackend, owner *bind.TransactOpts, coordinatorContract *functions_coordinator.FunctionsCoordinator, oracles []confighelper2.OracleIdentityExtra, batchSize int, functionsPluginConfig *functionsConfig.ReportingPluginConfig) { +func SetOracleConfig(t *testing.T, b *simulated.Backend, owner *bind.TransactOpts, coordinatorContract *functions_coordinator.FunctionsCoordinator, oracles []confighelper2.OracleIdentityExtra, batchSize int, functionsPluginConfig *functionsConfig.ReportingPluginConfig) { S := make([]int, len(oracles)) for i := 0; i < len(S); i++ { S[i] = 1 @@ -109,7 +110,7 @@ func SetOracleConfig(t *testing.T, b *backends.SimulatedBackend, owner *bind.Tra CommitWithFinality(b) } -func CreateAndFundSubscriptions(t *testing.T, b *backends.SimulatedBackend, owner *bind.TransactOpts, linkToken *link_token_interface.LinkToken, routerContractAddress common.Address, routerContract *functions_router.FunctionsRouter, clientContracts []deployedClientContract, allowListContract *functions_allow_list.TermsOfServiceAllowList) (subscriptionId uint64) { +func CreateAndFundSubscriptions(t *testing.T, b *simulated.Backend, owner *bind.TransactOpts, linkToken *link_token_interface.LinkToken, routerContractAddress common.Address, routerContract *functions_router.FunctionsRouter, clientContracts []deployedClientContract, allowListContract *functions_allow_list.TermsOfServiceAllowList) (subscriptionId uint64) { allowed, err := allowListContract.HasAccess(nilOpts, owner.From, []byte{}) require.NoError(t, err) if !allowed { @@ -152,7 +153,7 @@ func CreateAndFundSubscriptions(t *testing.T, b *backends.SimulatedBackend, owne const finalityDepth int = 4 -func CommitWithFinality(b *backends.SimulatedBackend) { +func CommitWithFinality(b *simulated.Backend) { for i := 0; i < finalityDepth; i++ { b.Commit() } @@ -168,7 +169,7 @@ type Coordinator struct { Contract *functions_coordinator.FunctionsCoordinator } -func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, *backends.SimulatedBackend, *time.Ticker, Coordinator, Coordinator, []deployedClientContract, common.Address, *functions_router.FunctionsRouter, *link_token_interface.LinkToken, common.Address, *functions_allow_list.TermsOfServiceAllowList) { +func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, *simulated.Backend, *time.Ticker, Coordinator, Coordinator, []deployedClientContract, common.Address, *functions_router.FunctionsRouter, *link_token_interface.LinkToken, common.Address, *functions_allow_list.TermsOfServiceAllowList) { owner := testutils.MustNewSimTransactor(t) owner.GasPrice = big.NewInt(int64(DefaultGasPrice)) sb := new(big.Int) @@ -275,7 +276,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, return owner, b, ticker, active, proposed, clientContracts, routerAddress, routerContract, linkToken, allowListAddress, allowListContract } -func SetupRouterRoutes(t *testing.T, b *backends.SimulatedBackend, owner *bind.TransactOpts, routerContract *functions_router.FunctionsRouter, coordinatorAddress common.Address, proposedCoordinatorAddress common.Address, allowListAddress common.Address) { +func SetupRouterRoutes(t *testing.T, b *simulated.Backend, owner *bind.TransactOpts, routerContract *functions_router.FunctionsRouter, coordinatorAddress common.Address, proposedCoordinatorAddress common.Address, allowListAddress common.Address) { allowListId, err := routerContract.GetAllowListId(nilOpts) require.NoError(t, err) var donId [32]byte @@ -311,7 +312,7 @@ func StartNewNode( t *testing.T, owner *bind.TransactOpts, port int, - b *backends.SimulatedBackend, + b *simulated.Backend, maxGas uint32, p2pV2Bootstrappers []commontypes.BootstrapperLocator, ocr2Keystore []byte, @@ -539,7 +540,7 @@ func GetExpectedResponse(source []byte) [32]byte { func CreateFunctionsNodes( t *testing.T, owner *bind.TransactOpts, - b *backends.SimulatedBackend, + b *simulated.Backend, routerAddress common.Address, nOracleNodes int, maxGas int, @@ -595,7 +596,7 @@ func CreateFunctionsNodes( func ClientTestRequests( t *testing.T, owner *bind.TransactOpts, - b *backends.SimulatedBackend, + b *simulated.Backend, linkToken *link_token_interface.LinkToken, routerAddress common.Address, routerContract *functions_router.FunctionsRouter, diff --git a/core/services/ocr2/plugins/llo/helpers_test.go b/core/services/ocr2/plugins/llo/helpers_test.go index 73f7fedc926..0f8686f3d93 100644 --- a/core/services/ocr2/plugins/llo/helpers_test.go +++ b/core/services/ocr2/plugins/llo/helpers_test.go @@ -14,7 +14,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" @@ -158,7 +157,7 @@ func setupNode( t *testing.T, port int, dbName string, - backend *backends.SimulatedBackend, + backend *simulated.Backend, csaKey csakey.KeyV2, ) (app chainlink.Application, peerID string, clientPubKey credentials.StaticSizedPublicKey, ocr2kb ocr2key.KeyBundle, observedLogs *observer.ObservedLogs) { k := big.NewInt(int64(port)) // keys unique to port diff --git a/core/services/ocr2/plugins/llo/integration_test.go b/core/services/ocr2/plugins/llo/integration_test.go index b6f752541f4..4fd28341602 100644 --- a/core/services/ocr2/plugins/llo/integration_test.go +++ b/core/services/ocr2/plugins/llo/integration_test.go @@ -11,7 +11,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -46,7 +45,7 @@ var ( multiplier int64 = 100000000 ) -func setupBlockchain(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBackend, *channel_verifier.ChannelVerifier, common.Address, *channel_config_store.ChannelConfigStore, common.Address) { +func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *channel_verifier.ChannelVerifier, common.Address, *channel_config_store.ChannelConfigStore, common.Address) { steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner genesisData := core.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) @@ -255,7 +254,7 @@ func TestIntegration_LLO(t *testing.T) { // TODO: test verification } -func setConfig(t *testing.T, steve *bind.TransactOpts, backend *backends.SimulatedBackend, verifierContract *channel_verifier.ChannelVerifier, verifierAddress common.Address, nodes []Node, oracles []confighelper.OracleIdentityExtra) ocr2types.ConfigDigest { +func setConfig(t *testing.T, steve *bind.TransactOpts, backend *simulated.Backend, verifierContract *channel_verifier.ChannelVerifier, verifierAddress common.Address, nodes []Node, oracles []confighelper.OracleIdentityExtra) ocr2types.ConfigDigest { // Setup config on contract rawOnchainConfig := datastreamsllo.OnchainConfig{} onchainConfig, err := (&datastreamsllo.JSONOnchainConfigCodec{}).Encode(rawOnchainConfig) @@ -310,7 +309,7 @@ func setConfig(t *testing.T, steve *bind.TransactOpts, backend *backends.Simulat return l.ConfigDigest } -func setChannelDefinitions(t *testing.T, steve *bind.TransactOpts, backend *backends.SimulatedBackend, configStoreContract *channel_config_store.ChannelConfigStore, streams []Stream) map[llotypes.ChannelID]channel_config_store.IChannelConfigStoreChannelDefinition { +func setChannelDefinitions(t *testing.T, steve *bind.TransactOpts, backend *simulated.Backend, configStoreContract *channel_config_store.ChannelConfigStore, streams []Stream) map[llotypes.ChannelID]channel_config_store.IChannelConfigStoreChannelDefinition { channels := []llotypes.ChannelID{ rand.Uint32(), rand.Uint32(), diff --git a/core/services/ocr2/plugins/mercury/helpers_test.go b/core/services/ocr2/plugins/mercury/helpers_test.go index fbb51557eb1..d35165f5c99 100644 --- a/core/services/ocr2/plugins/mercury/helpers_test.go +++ b/core/services/ocr2/plugins/mercury/helpers_test.go @@ -12,7 +12,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,6 +26,7 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest/heavyweight" @@ -154,7 +154,7 @@ func setupNode( t *testing.T, port int, dbName string, - backend *backends.SimulatedBackend, + backend *simulated.Backend, csaKey csakey.KeyV2, ) (app chainlink.Application, peerID string, clientPubKey credentials.StaticSizedPublicKey, ocr2kb ocr2key.KeyBundle, observedLogs *observer.ObservedLogs) { k := big.NewInt(int64(port)) // keys unique to port diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go index 2339117d4e3..26b6d139ed6 100644 --- a/core/services/ocr2/plugins/mercury/integration_test.go +++ b/core/services/ocr2/plugins/mercury/integration_test.go @@ -18,7 +18,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -89,7 +88,7 @@ func detectPanicLogs(t *testing.T, logObservers []*observer.ObservedLogs) { } } -func setupBlockchain(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBackend, *verifier.Verifier, common.Address) { +func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *verifier.Verifier, common.Address) { steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner genesisData := core.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 46314dde418..147ab78c530 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -9,7 +9,6 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -393,7 +392,7 @@ func waitLogProvider(ctx context.Context, t *testing.T, logProvider logprovider. } // waitLogPoller waits until the log poller is familiar with the given block -func waitLogPoller(ctx context.Context, t *testing.T, backend *backends.SimulatedBackend, lp logpoller.LogPollerTest, ethClient *evmclient.SimulatedBackendClient) { +func waitLogPoller(ctx context.Context, t *testing.T, backend *simulated.Backend, lp logpoller.LogPollerTest, ethClient *evmclient.SimulatedBackendClient) { t.Log("waiting for log poller to get updated") // let the log poller work b, err := ethClient.BlockByHash(ctx, backend.Commit()) @@ -421,7 +420,7 @@ func pollFn(ctx context.Context, t *testing.T, lp logpoller.LogPollerTest, ethCl func triggerEvents( ctx context.Context, t *testing.T, - backend *backends.SimulatedBackend, + backend *simulated.Backend, account *bind.TransactOpts, rounds int, poll func(blockHash common.Hash), @@ -450,7 +449,7 @@ func deployUpkeepCounter( t *testing.T, n int, ethClient *evmclient.SimulatedBackendClient, - backend *backends.SimulatedBackend, + backend *simulated.Backend, account *bind.TransactOpts, logProvider logprovider.LogEventProvider, ) ( @@ -494,7 +493,7 @@ func newPlainLogTriggerConfig(upkeepAddr common.Address) logprovider.LogTriggerC } } -func setupDependencies(t *testing.T, db *sqlx.DB, backend *backends.SimulatedBackend) (logpoller.LogPollerTest, *evmclient.SimulatedBackendClient) { +func setupDependencies(t *testing.T, db *sqlx.DB, backend *simulated.Backend) (logpoller.LogPollerTest, *evmclient.SimulatedBackendClient) { ethClient := evmclient.NewSimulatedBackendClient(t, backend, big.NewInt(1337)) pollerLggr := logger.TestLogger(t) pollerLggr.SetLogLevel(zapcore.WarnLevel) @@ -522,7 +521,7 @@ func setup(lggr logger.Logger, poller logpoller.LogPoller, c evmclient.Client, s return provider, recoverer } -func setupBackend(t *testing.T) (*backends.SimulatedBackend, func(), []*bind.TransactOpts) { +func setupBackend(t *testing.T) (*simulated.Backend, func(), []*bind.TransactOpts) { sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 6ebf381dfe0..a64adea158e 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -15,7 +15,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" @@ -559,7 +558,7 @@ func startMercuryServer(t *testing.T, mercuryServer *mercury.SimulatedMercurySer }) } -func makeDummyBlocks(t *testing.T, backend *backends.SimulatedBackend, interval time.Duration, count int) { +func makeDummyBlocks(t *testing.T, backend *simulated.Backend, interval time.Duration, count int) { go func() { ctx, cancel := context.WithCancel(testutils.Context(t)) defer cancel() @@ -593,7 +592,7 @@ func mapListener(m *sync.Map, n int) func() bool { } } -func listenPerformedN(t *testing.T, backend *backends.SimulatedBackend, registry *iregistry21.IKeeperRegistryMaster, ids []*big.Int, startBlock int64, count int) (func() bool, func()) { +func listenPerformedN(t *testing.T, backend *simulated.Backend, registry *iregistry21.IKeeperRegistryMaster, ids []*big.Int, startBlock int64, count int) (func() bool, func()) { cache := &sync.Map{} ctx, cancel := context.WithCancel(testutils.Context(t)) start := startBlock @@ -645,11 +644,11 @@ func listenPerformedN(t *testing.T, backend *backends.SimulatedBackend, registry return mapListener(cache, count), cancel } -func listenPerformed(t *testing.T, backend *backends.SimulatedBackend, registry *iregistry21.IKeeperRegistryMaster, ids []*big.Int, startBlock int64) (func() bool, func()) { +func listenPerformed(t *testing.T, backend *simulated.Backend, registry *iregistry21.IKeeperRegistryMaster, ids []*big.Int, startBlock int64) (func() bool, func()) { 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, useBufferV1 bool) ([]Node, *mercury.SimulatedMercuryServer) { +func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IKeeperRegistryMaster, backend *simulated.Backend, usr *bind.TransactOpts, useBufferV1 bool) ([]Node, *mercury.SimulatedMercuryServer) { lggr := logger.TestLogger(t) mServer := mercury.NewSimulatedMercuryServer() mServer.Start() @@ -805,7 +804,7 @@ func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IK return nodes, mServer } -func deployUpkeeps(t *testing.T, backend *backends.SimulatedBackend, carrol, steve *bind.TransactOpts, linkToken *link_token_interface.LinkToken, registry *iregistry21.IKeeperRegistryMaster, n int) ([]*big.Int, []common.Address, []*log_upkeep_counter_wrapper.LogUpkeepCounter) { +func deployUpkeeps(t *testing.T, backend *simulated.Backend, carrol, steve *bind.TransactOpts, linkToken *link_token_interface.LinkToken, registry *iregistry21.IKeeperRegistryMaster, n int) ([]*big.Int, []common.Address, []*log_upkeep_counter_wrapper.LogUpkeepCounter) { ids := make([]*big.Int, n) addrs := make([]common.Address, n) contracts := make([]*log_upkeep_counter_wrapper.LogUpkeepCounter, n) @@ -834,7 +833,7 @@ func deployUpkeeps(t *testing.T, backend *backends.SimulatedBackend, carrol, ste return ids, addrs, contracts } -func registerUpkeep(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, upkeepAddr common.Address, carrol, steve *bind.TransactOpts, backend *backends.SimulatedBackend) *big.Int { +func registerUpkeep(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, upkeepAddr common.Address, carrol, steve *bind.TransactOpts, backend *simulated.Backend) *big.Int { logTriggerConfigType := abi.MustNewType("tuple(address contractAddress, uint8 filterSelector, bytes32 topic0, bytes32 topic1, bytes32 topic2, bytes32 topic3)") logTriggerConfig, err := abi.Encode(map[string]interface{}{ "contractAddress": upkeepAddr, @@ -857,7 +856,7 @@ func registerUpkeep(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, u func deployKeeper21Registry( t *testing.T, auth *bind.TransactOpts, - backend *backends.SimulatedBackend, + backend *simulated.Backend, linkAddr, linkFeedAddr, gasFeedAddr common.Address, ) *iregistry21.IKeeperRegistryMaster { @@ -898,7 +897,7 @@ func deployKeeper21Registry( return registryMaster } -func getUpkeepIdFromTx21(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, registrationTx *gethtypes.Transaction, backend *backends.SimulatedBackend) *big.Int { +func getUpkeepIdFromTx21(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, registrationTx *gethtypes.Transaction, backend *simulated.Backend) *big.Int { receipt, err := backend.TransactionReceipt(testutils.Context(t), registrationTx.Hash()) require.NoError(t, err) parsedLog, err := registry.ParseUpkeepRegistered(*receipt.Logs[0]) @@ -912,7 +911,7 @@ type registerAndFundFunc func(*testing.T, common.Address, *bind.TransactOpts, ui func registerAndFund( registry *iregistry21.IKeeperRegistryMaster, registryOwner *bind.TransactOpts, - backend *backends.SimulatedBackend, + backend *simulated.Backend, linkToken *link_token_interface.LinkToken, ) registerAndFundFunc { return func(t *testing.T, upkeepAddr common.Address, upkeepOwner *bind.TransactOpts, trigger uint8, config []byte) *big.Int { @@ -967,7 +966,7 @@ type feedLookupUpkeepController struct { } func newFeedLookupUpkeepController( - backend *backends.SimulatedBackend, + backend *simulated.Backend, protocolOwner *bind.TransactOpts, ) (*feedLookupUpkeepController, error) { addr, _, contract, err := dummy_protocol_wrapper.DeployDummyProtocol(protocolOwner, backend) @@ -986,7 +985,7 @@ func newFeedLookupUpkeepController( func (c *feedLookupUpkeepController) DeployUpkeeps( t *testing.T, - backend *backends.SimulatedBackend, + backend *simulated.Backend, owner *bind.TransactOpts, count int, checkErrResultsProvider func(i int) bool, @@ -1032,7 +1031,7 @@ func (c *feedLookupUpkeepController) RegisterAndFund( t *testing.T, registry *iregistry21.IKeeperRegistryMaster, registryOwner *bind.TransactOpts, - backend *backends.SimulatedBackend, + backend *simulated.Backend, linkToken *link_token_interface.LinkToken, ) error { ids := make([]*big.Int, len(c.contracts)) @@ -1064,7 +1063,7 @@ func (c *feedLookupUpkeepController) RegisterAndFund( func (c *feedLookupUpkeepController) EnableMercury( t *testing.T, - backend *backends.SimulatedBackend, + backend *simulated.Backend, registry *iregistry21.IKeeperRegistryMaster, registryOwner *bind.TransactOpts, ) error { @@ -1111,7 +1110,7 @@ func (c *feedLookupUpkeepController) EnableMercury( func (c *feedLookupUpkeepController) VerifyEnv( t *testing.T, - backend *backends.SimulatedBackend, + backend *simulated.Backend, registry *iregistry21.IKeeperRegistryMaster, registryOwner *bind.TransactOpts, ) error { @@ -1155,7 +1154,7 @@ func (c *feedLookupUpkeepController) VerifyEnv( func (c *feedLookupUpkeepController) EmitEvents( t *testing.T, - backend *backends.SimulatedBackend, + backend *simulated.Backend, count int, afterEmit func(), ) error { diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index bb32d3a8530..6e746e85866 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -11,7 +11,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" @@ -76,7 +75,7 @@ var ( func deployKeeper20Registry( t *testing.T, auth *bind.TransactOpts, - backend *backends.SimulatedBackend, + backend *simulated.Backend, linkAddr, linkFeedAddr, gasFeedAddr common.Address, ) *keeper_registry_wrapper2_0.KeeperRegistry { @@ -108,7 +107,7 @@ func setupNode( t *testing.T, port int, nodeKey ethkey.KeyV2, - backend *backends.SimulatedBackend, + backend *simulated.Backend, p2pV2Bootstrappers []commontypes.BootstrapperLocator, mercury mercury.MercuryEndpointMock, ) (chainlink.Application, string, common.Address, ocr2key.KeyBundle) { @@ -192,7 +191,7 @@ func accountsToAddress(accounts []ocrTypes.Account) (addresses []common.Address, return addresses, nil } -func getUpkeepIdFromTx(t *testing.T, registry *keeper_registry_wrapper2_0.KeeperRegistry, registrationTx *gethtypes.Transaction, backend *backends.SimulatedBackend) *big.Int { +func getUpkeepIdFromTx(t *testing.T, registry *keeper_registry_wrapper2_0.KeeperRegistry, registrationTx *gethtypes.Transaction, backend *simulated.Backend) *big.Int { receipt, err := backend.TransactionReceipt(testutils.Context(t), registrationTx.Hash()) require.NoError(t, err) parsedLog, err := registry.ParseUpkeepRegistered(*receipt.Logs[0]) @@ -424,7 +423,7 @@ func setupForwarderForNode( t *testing.T, app chainlink.Application, caller *bind.TransactOpts, - backend *backends.SimulatedBackend, + backend *simulated.Backend, recipient common.Address, linkAddr common.Address) common.Address { faddr, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(caller, backend, linkAddr, caller.From, recipient, []byte{}) diff --git a/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go b/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go index fe14eb4451e..bd9e118d4c6 100644 --- a/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go +++ b/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/onsi/gomega" "github.com/stretchr/testify/require" @@ -32,6 +32,7 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" @@ -59,7 +60,7 @@ import ( type ocr2vrfUniverse struct { owner *bind.TransactOpts - backend *backends.SimulatedBackend + backend *simulated.Backend dkgAddress common.Address dkg *dkg_wrapper.DKG @@ -106,7 +107,7 @@ func setupOCR2VRFContracts( Balance: assets.Ether(100).ToInt(), }, } - b := backends.NewSimulatedBackend(genesisData, ethconfig.Defaults.Miner.GasCeil*2) + b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(ethconfig.Defaults.Miner.GasCeil*2)) // deploy OCR2VRF contracts, which have the following deploy order: // * link token @@ -221,7 +222,7 @@ func setupNodeOCR2( owner *bind.TransactOpts, port int, dbName string, - b *backends.SimulatedBackend, + b *simulated.Backend, useForwarders bool, p2pV2Bootstrappers []commontypes.BootstrapperLocator, ) *ocr2Node { diff --git a/core/services/relay/evm/functions/config_poller_test.go b/core/services/relay/evm/functions/config_poller_test.go index 2d96b2fd15d..9f4a9465246 100644 --- a/core/services/relay/evm/functions/config_poller_test.go +++ b/core/services/relay/evm/functions/config_poller_test.go @@ -7,10 +7,10 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -53,9 +53,9 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig require.NoError(t, err) user, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) - b := backends.NewSimulatedBackend(core.GenesisAlloc{ + b := simulated.NewBackend(types.GenesisAlloc{ user.From: {Balance: big.NewInt(1000000000000000000)}}, - 5*ethconfig.Defaults.Miner.GasCeil) + simulated.WithBlockGasLimit(5*ethconfig.Defaults.Miner.GasCeil)) defer b.Close() linkTokenAddress, _, _, err := link_token_interface.DeployLinkToken(user, b) require.NoError(t, err) @@ -63,7 +63,7 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig require.NoError(t, err, "failed to deploy test access controller contract") ocrAddress, _, ocrContract, err := ocr2aggregator.DeployOCR2Aggregator( user, - b, + b.Client(), linkTokenAddress, big.NewInt(0), big.NewInt(10), diff --git a/core/services/relay/evm/mercury/config_digest_test.go b/core/services/relay/evm/mercury/config_digest_test.go index fe718e92fe5..56004dcfdb4 100644 --- a/core/services/relay/evm/mercury/config_digest_test.go +++ b/core/services/relay/evm/mercury/config_digest_test.go @@ -7,11 +7,11 @@ import ( "unsafe" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/leanovate/gopter" "github.com/leanovate/gopter/gen" "github.com/leanovate/gopter/prop" @@ -28,12 +28,12 @@ func TestConfigCalculationMatches(t *testing.T) { require.NoError(t, err, "could not make private key for EOA owner") owner, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) - backend := backends.NewSimulatedBackend( - core.GenesisAlloc{owner.From: {Balance: new(big.Int).Lsh(big.NewInt(1), 60)}}, - ethconfig.Defaults.Miner.GasCeil, + backend := simulated.NewBackend( + types.GenesisAlloc{owner.From: {Balance: new(big.Int).Lsh(big.NewInt(1), 60)}}, + simulated.WithBlockGasLimit(ethconfig.Defaults.Miner.GasCeil), ) _, _, eoa, err := exposed_verifier.DeployExposedVerifier( - owner, backend, + owner, backend.Client(), ) backend.Commit() require.NoError(t, err, "could not deploy test EOA") diff --git a/core/services/relay/evm/mercury/config_poller_test.go b/core/services/relay/evm/mercury/config_poller_test.go index f828938f954..4f4a930280b 100644 --- a/core/services/relay/evm/mercury/config_poller_test.go +++ b/core/services/relay/evm/mercury/config_poller_test.go @@ -85,7 +85,7 @@ func TestMercuryConfigPoller(t *testing.T) { require.NoError(t, err, "failed to setConfig with feed ID") th.backend.Commit() - latest, err := th.backend.BlockByNumber(testutils.Context(t), nil) + latest, err := th.backend.Client().BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) // Ensure we capture this config set log. require.NoError(t, th.logPoller.Replay(testutils.Context(t), latest.Number().Int64()-1)) diff --git a/core/services/relay/evm/mercury/helpers_test.go b/core/services/relay/evm/mercury/helpers_test.go index f2923696bfc..9a0cfec7154 100644 --- a/core/services/relay/evm/mercury/helpers_test.go +++ b/core/services/relay/evm/mercury/helpers_test.go @@ -6,12 +6,12 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" "github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil" @@ -139,7 +139,7 @@ func buildSamplePayload(report []byte) []byte { type TestHarness struct { configPoller *ConfigPoller user *bind.TransactOpts - backend *backends.SimulatedBackend + backend *simulated.Backend verifierAddress common.Address verifierContract *verifier.Verifier logPoller logpoller.LogPoller @@ -150,13 +150,13 @@ func SetupTH(t *testing.T, feedID common.Hash) TestHarness { require.NoError(t, err) user, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) - b := backends.NewSimulatedBackend(core.GenesisAlloc{ + b := simulated.NewBackend(types.GenesisAlloc{ user.From: {Balance: big.NewInt(1000000000000000000)}}, - 5*ethconfig.Defaults.Miner.GasCeil) + simulated.WithBlockGasLimit(5*ethconfig.Defaults.Miner.GasCeil)) - proxyAddress, _, verifierProxy, err := verifier_proxy.DeployVerifierProxy(user, b, common.Address{}) + proxyAddress, _, verifierProxy, err := verifier_proxy.DeployVerifierProxy(user, b.Client(), common.Address{}) require.NoError(t, err, "failed to deploy test mercury verifier proxy contract") - verifierAddress, _, verifierContract, err := verifier.DeployVerifier(user, b, proxyAddress) + verifierAddress, _, verifierContract, err := verifier.DeployVerifier(user, b.Client(), proxyAddress) require.NoError(t, err, "failed to deploy test mercury verifier contract") _, err = verifierProxy.InitializeVerifier(user, verifierAddress) require.NoError(t, err) diff --git a/core/services/transmission/integration_test.go b/core/services/transmission/integration_test.go index c8c6137cad7..b294772bcbc 100644 --- a/core/services/transmission/integration_test.go +++ b/core/services/transmission/integration_test.go @@ -6,7 +6,6 @@ import ( "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" "github.com/ethereum/go-ethereum/core" "github.com/stretchr/testify/require" @@ -42,7 +41,7 @@ type EntryPointUniverse struct { holder1 *bind.TransactOpts holder1Key ethkey.KeyV2 holder2 *bind.TransactOpts - backend *backends.SimulatedBackend + backend *simulated.Backend entryPointAddress common.Address entryPoint *entry_point.EntryPoint factoryAddress common.Address diff --git a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go index 29d1db437d1..365614effda 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go @@ -19,7 +19,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" @@ -31,7 +30,7 @@ type contract struct { contract *bind.BoundContract address common.Address abi *abi.ABI - backend *backends.SimulatedBackend + backend *simulated.Backend } // deployVRFContract returns a deployed VRF contract, with some extra attributes @@ -60,7 +59,7 @@ func deployVRFContract(t *testing.T) (contract, common.Address) { // estimateGas returns the estimated gas cost of running the given method on the // contract at address to, on the given backend, with the given args, and given // that the transaction is sent from the from address. -func estimateGas(t *testing.T, backend *backends.SimulatedBackend, +func estimateGas(t *testing.T, backend *simulated.Backend, from, to common.Address, abi *abi.ABI, method string, args ...interface{}, ) uint64 { rawData, err := abi.Pack(method, args...) diff --git a/core/services/vrf/v2/bhs_feeder_test.go b/core/services/vrf/v2/bhs_feeder_test.go index b39fd0dec7f..f9eb4266080 100644 --- a/core/services/vrf/v2/bhs_feeder_test.go +++ b/core/services/vrf/v2/bhs_feeder_test.go @@ -84,7 +84,7 @@ func TestStartHeartbeats(t *testing.T) { t.Logf("Sleeping %.2f seconds before checking blockhash in BHS added by BHS_Heartbeats_Service\n", diff.Seconds()) time.Sleep(diff) // storeEarliest in BHS contract stores blocktip - 256 in the Blockhash Store (BHS) - tipHeader, err := uni.backend.HeaderByNumber(testutils.Context(t), nil) + tipHeader, err := uni.backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) // the storeEarliest transaction will end up in a new block, hence the + 1 below. blockNumberStored := tipHeader.Number.Uint64() - 256 + 1 diff --git a/core/services/vrf/v2/integration_helpers_test.go b/core/services/vrf/v2/integration_helpers_test.go index d61779c5714..9cbd1eb61f4 100644 --- a/core/services/vrf/v2/integration_helpers_test.go +++ b/core/services/vrf/v2/integration_helpers_test.go @@ -7,9 +7,9 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/google/uuid" "github.com/onsi/gomega" "github.com/shopspring/decimal" @@ -154,11 +154,11 @@ func testSingleConsumerHappyPath( assertNumRandomWords(t, consumerContract, numWords) // Assert that both send addresses were used to fulfill the requests - n, err := uni.backend.PendingNonceAt(ctx, key1.Address) + n, err := uni.backend.Client().PendingNonceAt(ctx, key1.Address) require.NoError(t, err) require.EqualValues(t, 1, n) - n, err = uni.backend.PendingNonceAt(ctx, key2.Address) + n, err = uni.backend.Client().PendingNonceAt(ctx, key2.Address) require.NoError(t, err) require.EqualValues(t, 1, n) @@ -849,7 +849,7 @@ func createSubscriptionAndGetSubscriptionCreatedEvent( t *testing.T, subOwner *bind.TransactOpts, coordinator v22.CoordinatorV2_X, - backend *backends.SimulatedBackend, + backend *simulated.Backend, ) v22.SubscriptionCreated { _, err := coordinator.CreateSubscription(subOwner) require.NoError(t, err) @@ -928,7 +928,7 @@ func testSingleConsumerForcedFulfillment( eoaConsumerAddr, _, eoaConsumer, err := vrf_external_sub_owner_example.DeployVRFExternalSubOwnerExample( uni.neil, - uni.backend, + uni.backend.Client(), uni.oldRootContractAddress, uni.linkContractAddress, ) @@ -1431,7 +1431,7 @@ func testSingleConsumerMultipleGasLanes( assertNumRandomWords(t, consumerContract, numWords) } -func topUpSubscription(t *testing.T, consumer *bind.TransactOpts, consumerContract vrftesthelpers.VRFConsumerContract, backend *backends.SimulatedBackend, fundingAmount *big.Int, nativePayment bool) { +func topUpSubscription(t *testing.T, consumer *bind.TransactOpts, consumerContract vrftesthelpers.VRFConsumerContract, backend *simulated.Backend, fundingAmount *big.Int, nativePayment bool) { if nativePayment { _, err := consumerContract.TopUpSubscriptionNative(consumer, fundingAmount) require.NoError(t, err) @@ -1614,11 +1614,11 @@ func testConsumerProxyHappyPath( assertNumRandomWords(t, consumerContract, numWords) // Assert that both send addresses were used to fulfill the requests - n, err := uni.backend.PendingNonceAt(ctx, key1.Address) + n, err := uni.backend.Client().PendingNonceAt(ctx, key1.Address) require.NoError(t, err) require.EqualValues(t, 1, n) - n, err = uni.backend.PendingNonceAt(ctx, key2.Address) + n, err = uni.backend.Client().PendingNonceAt(ctx, key2.Address) require.NoError(t, err) require.EqualValues(t, 1, n) @@ -1631,7 +1631,7 @@ func testConsumerProxyCoordinatorZeroAddress( ) { // Deploy another upgradeable consumer, proxy, and proxy admin // to test vrfCoordinator != 0x0 condition. - upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_upgradeable_example.DeployVRFConsumerV2UpgradeableExample(uni.neil, uni.backend) + upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_upgradeable_example.DeployVRFConsumerV2UpgradeableExample(uni.neil, uni.backend.Client()) require.NoError(t, err, "failed to deploy upgradeable consumer to simulated ethereum blockchain") uni.backend.Commit() @@ -1643,7 +1643,7 @@ func testConsumerProxyCoordinatorZeroAddress( uni.linkContractAddress) require.NoError(t, err) _, _, _, err = vrfv2_transparent_upgradeable_proxy.DeployVRFV2TransparentUpgradeableProxy( - uni.neil, uni.backend, upgradeableConsumerAddress, uni.proxyAdminAddress, initializeCalldata) + uni.neil, uni.backend.Client(), upgradeableConsumerAddress, uni.proxyAdminAddress, initializeCalldata) require.Error(t, err) } diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go index 1c05444948f..75030356cb7 100644 --- a/core/services/vrf/v2/integration_v2_plus_test.go +++ b/core/services/vrf/v2/integration_v2_plus_test.go @@ -17,6 +17,7 @@ import ( "github.com/stretchr/testify/require" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml" evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" @@ -107,33 +108,33 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer vrf_coordinator_v2plus_interface.IVRFCoordinatorV2PlusInternalABI)) require.NoError(t, err) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - h, err := backend.HeaderByNumber(testutils.Context(t), nil) + h, err := backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) blockTime := time.UnixMilli(int64(h.Time)) err = backend.AdjustTime(time.Since(blockTime) - 24*time.Hour) require.NoError(t, err) - backend.Commit() + // Deploy link linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - sergey, backend) + sergey, backend.Client()) require.NoError(t, err, "failed to deploy link contract to simulated ethereum blockchain") // Deploy feed linkEthFeed, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( - evil, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link + evil, backend.Client(), 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link require.NoError(t, err) // Deploy blockhash store - bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend) + bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend.Client()) require.NoError(t, err, "failed to deploy BlockhashStore contract to simulated ethereum blockchain") // Deploy trusted BHS - trustedBHSAddress, _, trustedBhsContract, err := trusted_blockhash_store.DeployTrustedBlockhashStore(neil, backend, []common.Address{}) + trustedBHSAddress, _, trustedBhsContract, err := trusted_blockhash_store.DeployTrustedBlockhashStore(neil, backend.Client(), []common.Address{}) require.NoError(t, err, "failed to deploy trusted BlockhashStore contract to simulated ethereum blockchain") // Deploy batch blockhash store - batchBHSAddress, _, batchBHSContract, err := batch_blockhash_store.DeployBatchBlockhashStore(neil, backend, bhsAddress) + batchBHSAddress, _, batchBHSContract, err := batch_blockhash_store.DeployBatchBlockhashStore(neil, backend.Client(), bhsAddress) require.NoError(t, err, "failed to deploy BatchBlockhashStore contract to simulated ethereum blockchain") // Deploy VRF V2plus coordinator @@ -143,7 +144,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer } coordinatorAddress, _, coordinatorContract, err := vrf_coordinator_v2_5.DeployVRFCoordinatorV25( - neil, backend, bhsAddr) + neil, backend.Client(), bhsAddr) require.NoError(t, err, "failed to deploy VRFCoordinatorV2 contract to simulated ethereum blockchain") backend.Commit() @@ -152,7 +153,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer backend.Commit() migrationTestCoordinatorAddress, _, migrationTestCoordinator, err := vrf_coordinator_v2_plus_v2_example.DeployVRFCoordinatorV2PlusV2Example( - neil, backend, linkAddress, coordinatorAddress) + neil, backend.Client(), linkAddress, coordinatorAddress) require.NoError(t, err) backend.Commit() @@ -163,7 +164,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer // Deploy batch VRF V2 coordinator batchCoordinatorAddress, _, batchCoordinatorContract, err := batch_vrf_coordinator_v2plus.DeployBatchVRFCoordinatorV2Plus( - neil, backend, coordinatorAddress, + neil, backend.Client(), coordinatorAddress, ) require.NoError(t, err, "failed to deploy BatchVRFCoordinatorV2 contract to simulated ethereum blockchain") backend.Commit() @@ -177,7 +178,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer // Deploy a VRF consumer. It has a starting balance of 500 LINK. consumerContractAddress, _, consumerContract, err2 := vrfv2plus_consumer_example.DeployVRFV2PlusConsumerExample( - author, backend, coordinatorAddress, linkAddress) + author, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err2, "failed to deploy VRFConsumer contract to simulated ethereum blockchain") _, err2 = linkContract.Transfer(sergey, consumerContractAddress, assets.Ether(500).ToInt()) // Actually, LINK require.NoError(t, err2, "failed to send LINK to VRFConsumer contract on simulated ethereum blockchain") @@ -191,18 +192,18 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer // Deploy malicious consumer with 1 link maliciousConsumerContractAddress, _, maliciousConsumerContract, err := vrf_malicious_consumer_v2_plus.DeployVRFMaliciousConsumerV2Plus( - evil, backend, coordinatorAddress, linkAddress) + evil, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err, "failed to deploy VRFMaliciousConsumer contract to simulated ethereum blockchain") _, err = linkContract.Transfer(sergey, maliciousConsumerContractAddress, assets.Ether(1).ToInt()) // Actually, LINK require.NoError(t, err, "failed to send LINK to VRFMaliciousConsumer contract on simulated ethereum blockchain") backend.Commit() // Deploy upgradeable consumer, proxy, and proxy admin - upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_plus_upgradeable_example.DeployVRFConsumerV2PlusUpgradeableExample(neil, backend) + upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_plus_upgradeable_example.DeployVRFConsumerV2PlusUpgradeableExample(neil, backend.Client()) require.NoError(t, err, "failed to deploy upgradeable consumer to simulated ethereum blockchain") backend.Commit() - proxyAdminAddress, _, proxyAdmin, err := vrfv2_proxy_admin.DeployVRFV2ProxyAdmin(neil, backend) + proxyAdminAddress, _, proxyAdmin, err := vrfv2_proxy_admin.DeployVRFV2ProxyAdmin(neil, backend.Client()) require.NoError(t, err) backend.Commit() @@ -215,7 +216,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer t.Log("initialize calldata:", hexified, "coordinator:", coordinatorAddress.String(), "link:", linkAddress) require.NoError(t, err) proxyAddress, _, _, err := vrfv2_transparent_upgradeable_proxy.DeployVRFV2TransparentUpgradeableProxy( - neil, backend, upgradeableConsumerAddress, proxyAdminAddress, initializeCalldata) + neil, backend.Client(), upgradeableConsumerAddress, proxyAdminAddress, initializeCalldata) require.NoError(t, err) _, err = linkContract.Transfer(sergey, proxyAddress, assets.Ether(500).ToInt()) // Actually, LINK @@ -228,7 +229,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer require.Equal(t, upgradeableConsumerAddress, implAddress) proxiedConsumer, err := vrf_consumer_v2_plus_upgradeable_example.NewVRFConsumerV2PlusUpgradeableExample( - proxyAddress, backend) + proxyAddress, backend.Client()) require.NoError(t, err) cAddress, err := proxiedConsumer.COORDINATOR(nil) @@ -243,7 +244,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer // Deploy always reverting consumer revertingConsumerContractAddress, _, revertingConsumerContract, err := vrfv2plus_reverting_example.DeployVRFV2PlusRevertingExample( - reverter, backend, coordinatorAddress, linkAddress, + reverter, backend.Client(), coordinatorAddress, linkAddress, ) require.NoError(t, err, "failed to deploy VRFRevertingExample contract to simulated eth blockchain") _, err = linkContract.Transfer(sergey, revertingConsumerContractAddress, assets.Ether(500).ToInt()) // Actually, LINK @@ -700,18 +701,18 @@ func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - owner, backend) + owner, backend.Client()) require.NoError(t, err) backend.Commit() // Deploy feed linkEthFeed, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( - owner, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link + owner, backend.Client(), 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link require.NoError(t, err) backend.Commit() coordinatorAddress, _, coordinator, err := vrf_coordinator_v2_5.DeployVRFCoordinatorV25( - owner, backend, common.Address{}) //bhs not needed for this test + owner, backend.Client(), common.Address{}) //bhs not needed for this test require.NoError(t, err) _, err = coordinator.SetConfig(owner, uint16(1), // minimumRequestConfirmations @@ -729,7 +730,7 @@ func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { _, err = coordinator.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed) require.NoError(t, err) backend.Commit() - consumerAddress, _, consumer, err := vrf_v2plus_sub_owner.DeployVRFV2PlusExternalSubOwnerExample(owner, backend, coordinatorAddress, linkAddress) + consumerAddress, _, consumer, err := vrf_v2plus_sub_owner.DeployVRFV2PlusExternalSubOwnerExample(owner, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err) backend.Commit() _, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt()) @@ -777,24 +778,24 @@ func TestVRFV2PlusIntegration_SimpleConsumerExample(t *testing.T) { } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - owner, backend) + owner, backend.Client()) require.NoError(t, err) backend.Commit() // Deploy feed linkEthFeed, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( - owner, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link + owner, backend.Client(), 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link require.NoError(t, err) backend.Commit() coordinatorAddress, _, coordinator, err := vrf_coordinator_v2_5.DeployVRFCoordinatorV25( - owner, backend, common.Address{}) // bhs not needed for this test + owner, backend.Client(), common.Address{}) // bhs not needed for this test require.NoError(t, err) backend.Commit() _, err = coordinator.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed) require.NoError(t, err) backend.Commit() - consumerAddress, _, consumer, err := vrf_v2plus_single_consumer.DeployVRFV2PlusSingleConsumerExample(owner, backend, coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{}, false) + consumerAddress, _, consumer, err := vrf_v2plus_single_consumer.DeployVRFV2PlusSingleConsumerExample(owner, backend.Client(), coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{}, false) require.NoError(t, err) backend.Commit() _, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt()) @@ -886,7 +887,7 @@ func TestVRFV2PlusIntegration_RequestCost(t *testing.T) { tx, err := consumerContract.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt()) require.NoError(tt, err) uni.backend.Commit() - r, err := uni.backend.TransactionReceipt(testutils.Context(t), tx.Hash()) + r, err := uni.backend.Client().TransactionReceipt(testutils.Context(t), tx.Hash()) require.NoError(tt, err) t.Log("gas used by proxied CreateSubscriptionAndFund:", r.GasUsed) @@ -1220,7 +1221,7 @@ func TestVRFV2PlusIntegration_Migration(t *testing.T) { require.NoError(t, err) linkContractBalance, err := uni.linkContract.BalanceOf(nil, uni.migrationTestCoordinatorAddress) require.NoError(t, err) - balance, err := uni.backend.BalanceAt(ctx, uni.migrationTestCoordinatorAddress, nil) + balance, err := uni.backend.Client().BalanceAt(ctx, uni.migrationTestCoordinatorAddress, nil) require.NoError(t, err) require.Equal(t, subV1.Balance(), totalLinkBalance) @@ -1321,7 +1322,7 @@ func TestVRFV2PlusIntegration_CancelSubscription(t *testing.T) { linkBalanceBeforeCancel, err := uni.linkContract.BalanceOf(nil, uni.neil.From) require.NoError(t, err) - nativeBalanceBeforeCancel, err := uni.backend.BalanceAt(testutils.Context(t), uni.neil.From, nil) + nativeBalanceBeforeCancel, err := uni.backend.Client().BalanceAt(testutils.Context(t), uni.neil.From, nil) require.NoError(t, err) // non-owner cannot cancel subscription diff --git a/core/services/vrf/v2/integration_v2_reverted_txns_test.go b/core/services/vrf/v2/integration_v2_reverted_txns_test.go index 4dfaf619b62..8357d802075 100644 --- a/core/services/vrf/v2/integration_v2_reverted_txns_test.go +++ b/core/services/vrf/v2/integration_v2_reverted_txns_test.go @@ -279,7 +279,7 @@ func fulfillVRFReq(t *testing.T, require.NoError(t, err) ec := th.uni.backend - chainID, err := th.uni.backend.ChainID(testutils.Context(t)) + chainID, err := th.uni.backend.Client().ChainID(testutils.Context(t)) require.NoError(t, err) chain, err := th.app.GetRelayers().LegacyEVMChains().Get(chainID.String()) require.NoError(t, err) @@ -346,7 +346,7 @@ func fulfilBatchVRFReq(t *testing.T, require.NoError(t, err) ec := th.uni.backend - chainID, err := th.uni.backend.ChainID(testutils.Context(t)) + chainID, err := th.uni.backend.Client().ChainID(testutils.Context(t)) require.NoError(t, err) chain, err := th.app.GetRelayers().LegacyEVMChains().Get(chainID.String()) require.NoError(t, err) @@ -597,7 +597,7 @@ func newRevertTxnTH(t *testing.T, th.eoaConsumerAddr, _, th.eoaConsumer, err = vrf_external_sub_owner_example.DeployVRFExternalSubOwnerExample( uni.neil, - uni.backend, + uni.backend.Client(), coordinatorAddress, uni.linkContractAddress, ) diff --git a/core/services/vrf/v2/integration_v2_test.go b/core/services/vrf/v2/integration_v2_test.go index 102d79a76c7..d1fc8555b94 100644 --- a/core/services/vrf/v2/integration_v2_test.go +++ b/core/services/vrf/v2/integration_v2_test.go @@ -13,12 +13,11 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/google/uuid" "github.com/onsi/gomega" "github.com/shopspring/decimal" @@ -110,7 +109,7 @@ type coordinatorV2UniverseCommon struct { proxyAdminAddress common.Address // Abstract representation of the ethereum blockchain - backend *backends.SimulatedBackend + backend *simulated.Backend coordinatorABI *abi.ABI consumerABI *abi.ABI @@ -166,7 +165,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in vrfConsumers = append(vrfConsumers, testutils.MustNewSimTransactor(t)) } - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, neil.From: {Balance: assets.Ether(1000).ToInt()}, ned.From: {Balance: assets.Ether(1000).ToInt()}, @@ -175,8 +174,10 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in reverter.From: {Balance: assets.Ether(1000).ToInt()}, } for _, consumer := range vrfConsumers { - genesisData[consumer.From] = core.GenesisAccount{ - Balance: assets.Ether(1000).ToInt(), + genesisData = gethtypes.GenesisAlloc{ + consumer.From: { + Balance: assets.Ether(1000).ToInt(), + }, } } @@ -188,42 +189,42 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in vrf_coordinator_v2.VRFCoordinatorV2ABI)) require.NoError(t, err) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - h, err := backend.HeaderByNumber(testutils.Context(t), nil) + h, err := backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) blockTime := time.UnixMilli(int64(h.Time)) err = backend.AdjustTime(time.Since(blockTime) - 24*time.Hour) require.NoError(t, err) - backend.Commit() + // Deploy link linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - sergey, backend) + sergey, backend.Client()) require.NoError(t, err, "failed to deploy link contract to simulated ethereum blockchain") // Deploy feed linkEthFeed, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( - evil, backend, 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link + evil, backend.Client(), 18, vrftesthelpers.WeiPerUnitLink.BigInt()) // 0.01 eth per link require.NoError(t, err) // Deploy blockhash store - bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend) + bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend.Client()) require.NoError(t, err, "failed to deploy BlockhashStore contract to simulated ethereum blockchain") // Deploy batch blockhash store - batchBHSAddress, _, batchBHSContract, err := batch_blockhash_store.DeployBatchBlockhashStore(neil, backend, bhsAddress) + batchBHSAddress, _, batchBHSContract, err := batch_blockhash_store.DeployBatchBlockhashStore(neil, backend.Client(), bhsAddress) require.NoError(t, err, "failed to deploy BatchBlockhashStore contract to simulated ethereum blockchain") // Deploy VRF V2 coordinator coordinatorAddress, _, coordinatorContract, err := vrf_coordinator_v2.DeployVRFCoordinatorV2( - neil, backend, linkAddress, bhsAddress, linkEthFeed /* linkEth*/) + neil, backend.Client(), linkAddress, bhsAddress, linkEthFeed /* linkEth*/) require.NoError(t, err, "failed to deploy VRFCoordinatorV2 contract to simulated ethereum blockchain") backend.Commit() // Deploy batch VRF V2 coordinator batchCoordinatorAddress, _, batchCoordinatorContract, err := batch_vrf_coordinator_v2.DeployBatchVRFCoordinatorV2( - neil, backend, coordinatorAddress, + neil, backend.Client(), coordinatorAddress, ) require.NoError(t, err, "failed to deploy BatchVRFCoordinatorV2 contract to simulated ethereum blockchain") backend.Commit() @@ -238,13 +239,13 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in // tests that don't really use this code path (which will be 99.9% of all // real-world use cases). vrfOwnerAddress, _, vrfOwner, err := vrf_owner.DeployVRFOwner( - neil, backend, oldRootContractAddress, + neil, backend.Client(), oldRootContractAddress, ) require.NoError(t, err, "failed to deploy VRFOwner contract to simulated ethereum blockchain") backend.Commit() vrfOwnerAddressNew, _, vrfOwnerNew, err := vrf_owner.DeployVRFOwner( - neil, backend, coordinatorAddress, + neil, backend.Client(), coordinatorAddress, ) require.NoError(t, err, "failed to deploy VRFOwner contract for vrfOwnerNew to simulated ethereum blockchain") backend.Commit() @@ -252,7 +253,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in // Deploy batch VRF V2 coordinator oldBatchCoordinatorAddress, _, oldBatchCoordinatorContract, err := batch_vrf_coordinator_v2.DeployBatchVRFCoordinatorV2( - neil, backend, coordinatorAddress, + neil, backend.Client(), coordinatorAddress, ) require.NoError(t, err, "failed to deploy BatchVRFCoordinatorV2 contract wrapping old vrf coordinator v2 to simulated ethereum blockchain") backend.Commit() @@ -266,7 +267,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in // Deploy a VRF consumer. It has a starting balance of 500 LINK. consumerContractAddress, _, consumerContract, err2 := vrf_consumer_v2.DeployVRFConsumerV2( - author, backend, coordinatorAddress, linkAddress) + author, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err2, "failed to deploy VRFConsumer contract to simulated ethereum blockchain") _, err2 = linkContract.Transfer(sergey, consumerContractAddress, assets.Ether(500).ToInt()) // Actually, LINK require.NoError(t, err2, "failed to send LINK to VRFConsumer contract on simulated ethereum blockchain") @@ -280,18 +281,18 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in // Deploy malicious consumer with 1 link maliciousConsumerContractAddress, _, maliciousConsumerContract, err := vrf_malicious_consumer_v2.DeployVRFMaliciousConsumerV2( - evil, backend, coordinatorAddress, linkAddress) + evil, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err, "failed to deploy VRFMaliciousConsumer contract to simulated ethereum blockchain") _, err = linkContract.Transfer(sergey, maliciousConsumerContractAddress, assets.Ether(1).ToInt()) // Actually, LINK require.NoError(t, err, "failed to send LINK to VRFMaliciousConsumer contract on simulated ethereum blockchain") backend.Commit() // Deploy upgradeable consumer, proxy, and proxy admin - upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_upgradeable_example.DeployVRFConsumerV2UpgradeableExample(neil, backend) + upgradeableConsumerAddress, _, _, err := vrf_consumer_v2_upgradeable_example.DeployVRFConsumerV2UpgradeableExample(neil, backend.Client()) require.NoError(t, err, "failed to deploy upgradeable consumer to simulated ethereum blockchain") backend.Commit() - proxyAdminAddress, _, proxyAdmin, err := vrfv2_proxy_admin.DeployVRFV2ProxyAdmin(neil, backend) + proxyAdminAddress, _, proxyAdmin, err := vrfv2_proxy_admin.DeployVRFV2ProxyAdmin(neil, backend.Client()) require.NoError(t, err) backend.Commit() @@ -304,7 +305,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in t.Log("initialize calldata:", hexified, "coordinator:", coordinatorAddress.String(), "link:", linkAddress) require.NoError(t, err) proxyAddress, _, _, err := vrfv2_transparent_upgradeable_proxy.DeployVRFV2TransparentUpgradeableProxy( - neil, backend, upgradeableConsumerAddress, proxyAdminAddress, initializeCalldata) + neil, backend.Client(), upgradeableConsumerAddress, proxyAdminAddress, initializeCalldata) require.NoError(t, err) _, err = linkContract.Transfer(sergey, proxyAddress, assets.Ether(500).ToInt()) // Actually, LINK @@ -317,7 +318,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in require.Equal(t, upgradeableConsumerAddress, implAddress) proxiedConsumer, err := vrf_consumer_v2_upgradeable_example.NewVRFConsumerV2UpgradeableExample( - proxyAddress, backend) + proxyAddress, backend.Client()) require.NoError(t, err) cAddress, err := proxiedConsumer.COORDINATOR(nil) @@ -332,7 +333,7 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in // Deploy always reverting consumer revertingConsumerContractAddress, _, revertingConsumerContract, err := vrfv2_reverting_example.DeployVRFV2RevertingExample( - reverter, backend, coordinatorAddress, linkAddress, + reverter, backend.Client(), coordinatorAddress, linkAddress, ) require.NoError(t, err, "failed to deploy VRFRevertingExample contract to simulated eth blockchain") _, err = linkContract.Transfer(sergey, revertingConsumerContractAddress, assets.Ether(500).ToInt()) // Actually, LINK @@ -434,7 +435,7 @@ func deployOldCoordinator( linkAddress common.Address, bhsAddress common.Address, linkEthFeed common.Address, - backend *backends.SimulatedBackend, + backend *simulated.Backend, neil *bind.TransactOpts, ) ( common.Address, @@ -445,30 +446,30 @@ func deployOldCoordinator( ctorArgs, err := evmutils.ABIEncode(`[{"type":"address"}, {"type":"address"}, {"type":"address"}]`, linkAddress, bhsAddress, linkEthFeed) require.NoError(t, err) bytecode = append(bytecode, ctorArgs...) - nonce, err := backend.PendingNonceAt(ctx, neil.From) + nonce, err := backend.Client().PendingNonceAt(ctx, neil.From) require.NoError(t, err) - gasPrice, err := backend.SuggestGasPrice(ctx) + gasPrice, err := backend.Client().SuggestGasPrice(ctx) require.NoError(t, err) unsignedTx := gethtypes.NewContractCreation(nonce, big.NewInt(0), 15e6, gasPrice, bytecode) signedTx, err := neil.Signer(neil.From, unsignedTx) require.NoError(t, err) - err = backend.SendTransaction(ctx, signedTx) + err = backend.Client().SendTransaction(ctx, signedTx) require.NoError(t, err, "could not deploy old vrf coordinator to simulated blockchain") backend.Commit() - receipt, err := backend.TransactionReceipt(ctx, signedTx.Hash()) + receipt, err := backend.Client().TransactionReceipt(ctx, signedTx.Hash()) require.NoError(t, err) oldRootContractAddress := receipt.ContractAddress require.NotEqual(t, common.HexToAddress("0x0"), oldRootContractAddress, "old vrf coordinator address equal to zero address, deployment failed") - oldRootContract, err := vrf_coordinator_v2.NewVRFCoordinatorV2(oldRootContractAddress, backend) + oldRootContract, err := vrf_coordinator_v2.NewVRFCoordinatorV2(oldRootContractAddress, backend.Client()) require.NoError(t, err, "could not create wrapper object for old vrf coordinator v2") return oldRootContractAddress, oldRootContract } // Send eth from prefunded account. // Amount is number of ETH not wei. -func sendEth(t *testing.T, key ethkey.KeyV2, ec *backends.SimulatedBackend, to common.Address, eth int) { +func sendEth(t *testing.T, key ethkey.KeyV2, b *simulated.Backend, to common.Address, eth int) { ctx := testutils.Context(t) - nonce, err := ec.PendingNonceAt(ctx, key.Address) + nonce, err := b.Client().PendingNonceAt(ctx, key.Address) require.NoError(t, err) tx := gethtypes.NewTx(&gethtypes.DynamicFeeTx{ ChainID: testutils.SimulatedChainID, @@ -482,9 +483,9 @@ func sendEth(t *testing.T, key ethkey.KeyV2, ec *backends.SimulatedBackend, to c }) signedTx, err := gethtypes.SignTx(tx, gethtypes.NewLondonSigner(testutils.SimulatedChainID), key.ToEcdsaPrivKey()) require.NoError(t, err) - err = ec.SendTransaction(ctx, signedTx) + err = b.Client().SendTransaction(ctx, signedTx) require.NoError(t, err) - ec.Commit() + b.Commit() } func subscribeVRF( @@ -492,7 +493,7 @@ func subscribeVRF( author *bind.TransactOpts, consumerContract vrftesthelpers.VRFConsumerContract, coordinator v22.CoordinatorV2_X, - backend *backends.SimulatedBackend, + backend *simulated.Backend, fundingAmount *big.Int, nativePayment bool, ) (v22.Subscription, *big.Int) { @@ -665,7 +666,7 @@ func requestRandomnessAndAssertRandomWordsRequestedEvent( numWords uint32, cbGasLimit uint32, coordinator v22.CoordinatorV2_X, - backend *backends.SimulatedBackend, + backend *simulated.Backend, nativePayment bool, ) (requestID *big.Int, requestBlockNumber uint64) { minRequestConfirmations := uint16(2) @@ -714,7 +715,7 @@ func subscribeAndAssertSubscriptionCreatedEvent( consumerContractAddress common.Address, fundingAmount *big.Int, coordinator v22.CoordinatorV2_X, - backend *backends.SimulatedBackend, + backend *simulated.Backend, nativePayment bool, ) *big.Int { // Create a subscription and fund with LINK. @@ -781,7 +782,7 @@ func assertNumRandomWords( } } -func mine(t *testing.T, requestID, subID *big.Int, backend *backends.SimulatedBackend, db *sqlx.DB, vrfVersion vrfcommon.Version, chainId *big.Int) bool { +func mine(t *testing.T, requestID, subID *big.Int, backend *simulated.Backend, db *sqlx.DB, vrfVersion vrfcommon.Version, chainId *big.Int) bool { txstore := txmgr.NewTxStore(db, logger.TestLogger(t)) var metaField string if vrfVersion == vrfcommon.V2Plus { @@ -807,7 +808,7 @@ func mine(t *testing.T, requestID, subID *big.Int, backend *backends.SimulatedBa }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue()) } -func mineBatch(t *testing.T, requestIDs []*big.Int, subID *big.Int, backend *backends.SimulatedBackend, db *sqlx.DB, vrfVersion vrfcommon.Version, chainId *big.Int) bool { +func mineBatch(t *testing.T, requestIDs []*big.Int, subID *big.Int, backend *simulated.Backend, db *sqlx.DB, vrfVersion vrfcommon.Version, chainId *big.Int) bool { requestIDMap := map[string]bool{} txstore := txmgr.NewTxStore(db, logger.TestLogger(t)) var metaField string @@ -1145,7 +1146,7 @@ func deployWrapper(t *testing.T, uni coordinatorV2UniverseCommon, wrapperOverhea wrapperConsumer *vrfv2_wrapper_consumer_example.VRFV2WrapperConsumerExample, wrapperConsumerAddress common.Address, ) { - wrapperAddress, _, wrapper, err := vrfv2_wrapper.DeployVRFV2Wrapper(uni.neil, uni.backend, uni.linkContractAddress, uni.linkEthFeedAddress, uni.rootContractAddress) + wrapperAddress, _, wrapper, err := vrfv2_wrapper.DeployVRFV2Wrapper(uni.neil, uni.backend.Client(), uni.linkContractAddress, uni.linkEthFeedAddress, uni.rootContractAddress) require.NoError(t, err) uni.backend.Commit() @@ -1153,7 +1154,7 @@ func deployWrapper(t *testing.T, uni coordinatorV2UniverseCommon, wrapperOverhea require.NoError(t, err) uni.backend.Commit() - wrapperConsumerAddress, _, wrapperConsumer, err = vrfv2_wrapper_consumer_example.DeployVRFV2WrapperConsumerExample(uni.neil, uni.backend, uni.linkContractAddress, wrapperAddress) + wrapperConsumerAddress, _, wrapperConsumer, err = vrfv2_wrapper_consumer_example.DeployVRFV2WrapperConsumerExample(uni.neil, uni.backend.Client(), uni.linkContractAddress, wrapperAddress) require.NoError(t, err) uni.backend.Commit() @@ -1521,18 +1522,18 @@ func registerProvingKeyHelper(t *testing.T, uni coordinatorV2UniverseCommon, coo func TestExternalOwnerConsumerExample(t *testing.T) { owner := testutils.MustNewSimTransactor(t) random := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, random.From: {Balance: assets.Ether(10).ToInt()}, } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - owner, backend) + owner, backend.Client()) require.NoError(t, err) backend.Commit() coordinatorAddress, _, coordinator, err := vrf_coordinator_v2.DeployVRFCoordinatorV2( - owner, backend, linkAddress, common.Address{}, common.Address{}) + owner, backend.Client(), linkAddress, common.Address{}, common.Address{}) require.NoError(t, err) _, err = coordinator.SetConfig(owner, uint16(1), uint32(10000), 1, 1, big.NewInt(10), vrf_coordinator_v2.VRFCoordinatorV2FeeConfig{ FulfillmentFlatFeeLinkPPMTier1: 0, @@ -1547,7 +1548,7 @@ func TestExternalOwnerConsumerExample(t *testing.T) { }) require.NoError(t, err) backend.Commit() - consumerAddress, _, consumer, err := vrf_external_sub_owner_example.DeployVRFExternalSubOwnerExample(owner, backend, coordinatorAddress, linkAddress) + consumerAddress, _, consumer, err := vrf_external_sub_owner_example.DeployVRFExternalSubOwnerExample(owner, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err) backend.Commit() _, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt()) @@ -1582,20 +1583,20 @@ func TestExternalOwnerConsumerExample(t *testing.T) { func TestSimpleConsumerExample(t *testing.T) { owner := testutils.MustNewSimTransactor(t) random := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - owner, backend) + owner, backend.Client()) require.NoError(t, err) backend.Commit() coordinatorAddress, _, _, err := vrf_coordinator_v2.DeployVRFCoordinatorV2( - owner, backend, linkAddress, common.Address{}, common.Address{}) + owner, backend.Client(), linkAddress, common.Address{}, common.Address{}) require.NoError(t, err) backend.Commit() - consumerAddress, _, consumer, err := vrf_single_consumer_example.DeployVRFSingleConsumerExample(owner, backend, coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{}) + consumerAddress, _, consumer, err := vrf_single_consumer_example.DeployVRFSingleConsumerExample(owner, backend.Client(), coordinatorAddress, linkAddress, 1, 1, 1, [32]byte{}) require.NoError(t, err) backend.Commit() _, err = linkContract.Transfer(owner, consumerAddress, assets.Ether(2).ToInt()) @@ -1736,7 +1737,7 @@ func TestIntegrationVRFV2(t *testing.T) { return len(rf) == 1 }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue()) assert.True(t, rf[0].Success(), "expected callback to succeed") - fulfillReceipt, err := uni.backend.TransactionReceipt(ctx, rf[0].Raw().TxHash) + fulfillReceipt, err := uni.backend.Client().TransactionReceipt(ctx, rf[0].Raw().TxHash) require.NoError(t, err) // Assert all the random words received by the consumer are different and non-zero. @@ -1873,7 +1874,7 @@ func TestRequestCost(t *testing.T) { tx, err := consumerContract.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt()) require.NoError(tt, err) uni.backend.Commit() - r, err := uni.backend.TransactionReceipt(testutils.Context(t), tx.Hash()) + r, err := uni.backend.Client().TransactionReceipt(testutils.Context(t), tx.Hash()) require.NoError(tt, err) t.Log("gas used by proxied CreateSubscriptionAndFund:", r.GasUsed) @@ -2268,8 +2269,8 @@ func AssertLinkBalance(t *testing.T, linkContract *link_token_interface.LinkToke assert.Equal(t, balance.String(), b.String(), "invalid balance for %v", address) } -func AssertNativeBalance(t *testing.T, backend *backends.SimulatedBackend, address common.Address, balance *big.Int) { - b, err := backend.BalanceAt(testutils.Context(t), address, nil) +func AssertNativeBalance(t *testing.T, backend *simulated.Backend, address common.Address, balance *big.Int) { + b, err := backend.Client().BalanceAt(testutils.Context(t), address, nil) require.NoError(t, err) assert.Equal(t, balance.String(), b.String(), "invalid balance for %v", address) } @@ -2288,14 +2289,14 @@ func pair(x, y *big.Int) [2]*big.Int { return [2]*big.Int{x, y} } // estimateGas returns the estimated gas cost of running the given method on the // contract at address to, on the given backend, with the given args, and given // that the transaction is sent from the from address. -func estimateGas(t *testing.T, backend *backends.SimulatedBackend, +func estimateGas(t *testing.T, backend *simulated.Backend, from, to common.Address, abi *abi.ABI, method string, args ...interface{}, ) uint64 { rawData, err := abi.Pack(method, args...) require.NoError(t, err, "failed to construct raw %s transaction with args %s", method, args) callMsg := ethereum.CallMsg{From: from, To: &to, Data: rawData} - estimate, err := backend.EstimateGas(testutils.Context(t), callMsg) + estimate, err := backend.Client().EstimateGas(testutils.Context(t), callMsg) require.NoError(t, err, "failed to estimate gas from %s call with args %s", method, args) return estimate diff --git a/core/services/vrf/v2/listener_v2_log_listener_test.go b/core/services/vrf/v2/listener_v2_log_listener_test.go index 7ac820b25a5..00b2d535825 100644 --- a/core/services/vrf/v2/listener_v2_log_listener_test.go +++ b/core/services/vrf/v2/listener_v2_log_listener_test.go @@ -10,9 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/jmoiron/sqlx" @@ -86,7 +84,6 @@ func setupVRFLogPollerListenerTH(t *testing.T, blockTime := time.UnixMilli(int64(h.Time)) err = backend.AdjustTime(time.Since(blockTime) - FirstBlockAge) require.NoError(t, err) - backend.Commit() esc := client.NewSimulatedBackendClient(t, backend, chainID) // Mark genesis block as finalized to avoid any nulls in the tests @@ -815,15 +812,15 @@ func SetupGetUnfulfilledTH(t *testing.T) (*listenerV2, *ubig.Big) { // Construct CoordinatorV2_X object for VRF listener owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + b := simulated.NewBackend(ethtypes.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) - _, _, vrfLogEmitter, err := vrf_log_emitter.DeployVRFLogEmitter(owner, ec) + }, simulated.WithBlockGasLimit(10e6)) + _, _, vrfLogEmitter, err := vrf_log_emitter.DeployVRFLogEmitter(owner, b.Client()) require.NoError(t, err) - ec.Commit() - coordinatorV2, err := vrf_coordinator_v2.NewVRFCoordinatorV2(vrfLogEmitter.Address(), ec) + b.Commit() + coordinatorV2, err := vrf_coordinator_v2.NewVRFCoordinatorV2(vrfLogEmitter.Address(), b.Client()) require.Nil(t, err) coordinator := NewCoordinatorV2(coordinatorV2) diff --git a/core/services/vrf/vrftesthelpers/helpers.go b/core/services/vrf/vrftesthelpers/helpers.go index 33ad8470731..2a534e675c1 100644 --- a/core/services/vrf/vrftesthelpers/helpers.go +++ b/core/services/vrf/vrftesthelpers/helpers.go @@ -8,10 +8,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/google/uuid" "github.com/onsi/gomega" "github.com/shopspring/decimal" @@ -149,7 +149,7 @@ type CoordinatorUniverse struct { BHSContractAddress common.Address // Abstraction representation of the ethereum blockchain - Backend *backends.SimulatedBackend + Backend *simulated.Backend CoordinatorABI *abi.ABI ConsumerABI *abi.ABI // Cast of participants @@ -165,10 +165,10 @@ func NewVRFCoordinatorUniverseWithV08Consumer(t *testing.T, key ethkey.KeyV2) Co cu := NewVRFCoordinatorUniverse(t, key) consumerContractAddress, _, consumerContract, err := solidity_vrf_consumer_interface_v08.DeployVRFConsumer( - cu.Carol, cu.Backend, cu.RootContractAddress, cu.LinkContractAddress) + cu.Carol, cu.Backend.Client(), cu.RootContractAddress, cu.LinkContractAddress) require.NoError(t, err, "failed to deploy v08 VRFConsumer contract to simulated ethereum blockchain") _, _, requestIDBase, err := - solidity_vrf_request_id_v08.DeployVRFRequestIDBaseTestHelper(cu.Neil, cu.Backend) + solidity_vrf_request_id_v08.DeployVRFRequestIDBaseTestHelper(cu.Neil, cu.Backend.Client()) require.NoError(t, err, "failed to deploy v08 VRFRequestIDBaseTestHelper contract to simulated ethereum blockchain") cu.ConsumerContractAddressV08 = consumerContractAddress cu.RequestIDBaseV08 = requestIDBase @@ -215,20 +215,20 @@ func NewVRFCoordinatorUniverse(t *testing.T, keys ...ethkey.KeyV2) CoordinatorUn require.NoError(t, err) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) linkAddress, _, linkContract, err := link_token_interface.DeployLinkToken( - sergey, backend) + sergey, backend.Client()) require.NoError(t, err, "failed to deploy link contract to simulated ethereum blockchain") - bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend) + bhsAddress, _, bhsContract, err := blockhash_store.DeployBlockhashStore(neil, backend.Client()) require.NoError(t, err, "failed to deploy BlockhashStore contract to simulated ethereum blockchain") coordinatorAddress, _, coordinatorContract, err := solidity_vrf_coordinator_interface.DeployVRFCoordinator( - neil, backend, linkAddress, bhsAddress) + neil, backend.Client(), linkAddress, bhsAddress) require.NoError(t, err, "failed to deploy VRFCoordinator contract to simulated ethereum blockchain") consumerContractAddress, _, consumerContract, err := solidity_vrf_consumer_interface.DeployVRFConsumer( - carol, backend, coordinatorAddress, linkAddress) + carol, backend.Client(), coordinatorAddress, linkAddress) require.NoError(t, err, "failed to deploy VRFConsumer contract to simulated ethereum blockchain") _, _, requestIDBase, err := - solidity_vrf_request_id.DeployVRFRequestIDBaseTestHelper(neil, backend) + solidity_vrf_request_id.DeployVRFRequestIDBaseTestHelper(neil, backend.Client()) require.NoError(t, err, "failed to deploy VRFRequestIDBaseTestHelper contract to simulated ethereum blockchain") _, err = linkContract.Transfer(sergey, consumerContractAddress, oneEth) // Actually, LINK require.NoError(t, err, "failed to send LINK to VRFConsumer contract on simulated ethereum blockchain") From 2c270cf7474c24b86c97bea2546a14c12a541605 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 20:02:39 -0700 Subject: [PATCH 22/30] Update keepers, fluxmointor, transmitter,ocr test types --- .../evm/forwarders/forwarder_manager_test.go | 26 ++++---- core/gethwrappers/abigen_test.go | 10 ++-- core/internal/cltest/simulated_backend.go | 3 +- core/internal/features/features_test.go | 47 +++++++-------- .../features/ocr2/features_ocr2_test.go | 16 ++--- .../fluxmonitorv2/integrations_test.go | 11 ++-- core/services/keeper/integration_test.go | 6 +- .../ocr2/plugins/mercury/helpers_test.go | 1 + .../ocr2/plugins/mercury/integration_test.go | 17 +++--- .../plugins/ocr2keeper/integration_21_test.go | 57 +++++++++--------- .../plugins/ocr2keeper/integration_test.go | 29 ++++----- .../internal/ocr2vrf_integration_test.go | 30 +++++----- .../relay/evm/functions/config_poller_test.go | 6 +- .../services/transmission/integration_test.go | 59 ++++++++++--------- core/services/vrf/v1/integration_test.go | 7 ++- 15 files changed, 167 insertions(+), 158 deletions(-) diff --git a/core/chains/evm/forwarders/forwarder_manager_test.go b/core/chains/evm/forwarders/forwarder_manager_test.go index d9979565b48..9c4ab02fb40 100644 --- a/core/chains/evm/forwarders/forwarder_manager_test.go +++ b/core/chains/evm/forwarders/forwarder_manager_test.go @@ -42,26 +42,26 @@ func TestFwdMgr_MaybeForwardTransaction(t *testing.T) { owner := testutils.MustNewSimTransactor(t) ctx := testutils.Context(t) - ec := simulated.NewBackend(types.GenesisAlloc{ + b := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, simulated.WithBlockGasLimit(10e6)) - t.Cleanup(func() { ec.Close() }) + t.Cleanup(func() { b.Close() }) linkAddr := common.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709") - operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, ec, linkAddr, owner.From) + operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, b.Client(), linkAddr, owner.From) require.NoError(t, err) - forwarderAddr, _, forwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, ec, linkAddr, owner.From, operatorAddr, []byte{}) + forwarderAddr, _, forwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), linkAddr, owner.From, operatorAddr, []byte{}) require.NoError(t, err) - ec.Commit() + b.Commit() _, err = forwarder.SetAuthorizedSenders(owner, []common.Address{owner.From}) require.NoError(t, err) - ec.Commit() + b.Commit() authorized, err := forwarder.GetAuthorizedSenders(nil) require.NoError(t, err) t.Log(authorized) - evmClient := client.NewSimulatedBackendClient(t, ec, testutils.FixtureChainID) + evmClient := client.NewSimulatedBackendClient(t, b, testutils.FixtureChainID) lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, @@ -109,21 +109,21 @@ func TestFwdMgr_AccountUnauthorizedToForward_SkipsForwarding(t *testing.T) { cfg := configtest.NewTestGeneralConfig(t) evmcfg := evmtest.NewChainScopedConfig(t, cfg) owner := testutils.MustNewSimTransactor(t) - ec := simulated.NewBackend(types.GenesisAlloc{ + b := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, }, simulated.WithBlockGasLimit(10e6)) - t.Cleanup(func() { ec.Close() }) + t.Cleanup(func() { b.Close() }) linkAddr := common.HexToAddress("0x01BE23585060835E02B77ef475b0Cc51aA1e0709") - operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, ec, linkAddr, owner.From) + operatorAddr, _, _, err := operator_wrapper.DeployOperator(owner, b.Client(), linkAddr, owner.From) require.NoError(t, err) - forwarderAddr, _, _, err := authorized_forwarder.DeployAuthorizedForwarder(owner, ec, linkAddr, owner.From, operatorAddr, []byte{}) + forwarderAddr, _, _, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), linkAddr, owner.From, operatorAddr, []byte{}) require.NoError(t, err) - ec.Commit() + b.Commit() - evmClient := client.NewSimulatedBackendClient(t, ec, testutils.FixtureChainID) + evmClient := client.NewSimulatedBackendClient(t, b, testutils.FixtureChainID) lpOpts := logpoller.Opts{ PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, diff --git a/core/gethwrappers/abigen_test.go b/core/gethwrappers/abigen_test.go index 6d6023ed7f4..5874bf0b57c 100644 --- a/core/gethwrappers/abigen_test.go +++ b/core/gethwrappers/abigen_test.go @@ -4,9 +4,8 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_emitter" @@ -17,11 +16,12 @@ import ( // We perform this test using the generated LogEmitter wrapper. func TestGeneratedDeployMethodAddressField(t *testing.T) { owner := testutils.MustNewSimTransactor(t) - ec := backends.NewSimulatedBackend(map[common.Address]core.GenesisAccount{ + ec := simulated.NewBackend(types.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), }, - }, 10e6) + }, simulated.WithBlockGasLimit(10e6)).Client() + emitterAddr, _, emitter, err := log_emitter.DeployLogEmitter(owner, ec) require.NoError(t, err) require.Equal(t, emitterAddr, emitter.Address()) diff --git a/core/internal/cltest/simulated_backend.go b/core/internal/cltest/simulated_backend.go index 3637adbd2dc..1496c54798a 100644 --- a/core/internal/cltest/simulated_backend.go +++ b/core/internal/cltest/simulated_backend.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" + evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/evmtest" @@ -75,7 +76,7 @@ func NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain( } // Mine forces the simulated backend to produce a new block every X seconds -func Mine(backend *simulated.Backend, blockTime time.Duration) (stopMining func()) { +func Mine(backend evmtypes.Backend, blockTime time.Duration) (stopMining func()) { timer := time.NewTicker(blockTime) chStop := make(chan struct{}) wg := sync.WaitGroup{} diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go index 55169ef4ff9..f8f2a173490 100644 --- a/core/internal/features/features_test.go +++ b/core/internal/features/features_test.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/rpc" "github.com/google/uuid" "github.com/hashicorp/consul/sdk/freeport" @@ -303,20 +304,20 @@ func setupOperatorContracts(t *testing.T) OperatorContracts { } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) b := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(user, b) + linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(user, b.Client()) require.NoError(t, err) b.Commit() - operatorAddress, _, operatorContract, err := operator_wrapper.DeployOperator(user, b, linkTokenAddress, user.From) + operatorAddress, _, operatorContract, err := operator_wrapper.DeployOperator(user, b.Client(), linkTokenAddress, user.From) require.NoError(t, err) b.Commit() var empty [32]byte - multiWordConsumerAddress, _, multiWordConsumerContract, err := multiwordconsumer_wrapper.DeployMultiWordConsumer(user, b, linkTokenAddress, operatorAddress, empty) + multiWordConsumerAddress, _, multiWordConsumerContract, err := multiwordconsumer_wrapper.DeployMultiWordConsumer(user, b.Client(), linkTokenAddress, operatorAddress, empty) require.NoError(t, err) b.Commit() - singleConsumerAddress, _, singleConsumerContract, err := consumer_wrapper.DeployConsumer(user, b, linkTokenAddress, operatorAddress, empty) + singleConsumerAddress, _, singleConsumerContract, err := consumer_wrapper.DeployConsumer(user, b.Client(), linkTokenAddress, operatorAddress, empty) require.NoError(t, err) b.Commit() @@ -379,15 +380,15 @@ func TestIntegration_DirectRequest(t *testing.T) { tx, err := operatorContracts.operator.SetAuthorizedSenders(operatorContracts.user, authorizedSenders) require.NoError(t, err) b.Commit() - cltest.RequireTxSuccessful(t, b, tx.Hash()) + cltest.RequireTxSuccessful(t, b.Client(), tx.Hash()) // Fund node account with ETH. - n, err := b.NonceAt(testutils.Context(t), operatorContracts.user.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), operatorContracts.user.From, nil) require.NoError(t, err) tx = cltest.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := operatorContracts.user.Signer(operatorContracts.user.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() @@ -409,7 +410,7 @@ func TestIntegration_DirectRequest(t *testing.T) { tx, err = operatorContracts.multiWord.SetSpecID(operatorContracts.user, jobID) require.NoError(t, err) b.Commit() - cltest.RequireTxSuccessful(t, b, tx.Hash()) + cltest.RequireTxSuccessful(t, b.Client(), tx.Hash()) operatorContracts.user.GasLimit = 1000000 tx, err = operatorContracts.multiWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, @@ -420,7 +421,7 @@ func TestIntegration_DirectRequest(t *testing.T) { ) require.NoError(t, err) b.Commit() - cltest.RequireTxSuccessful(t, b, tx.Hash()) + cltest.RequireTxSuccessful(t, b.Client(), tx.Hash()) empty := big.NewInt(0) assertPricesUint256(t, empty, empty, empty, operatorContracts.multiWord) @@ -446,7 +447,7 @@ func TestIntegration_DirectRequest(t *testing.T) { tx, err = operatorContracts.singleWord.SetSpecID(operatorContracts.user, jobIDSingleWord) require.NoError(t, err) b.Commit() - cltest.RequireTxSuccessful(t, b, tx.Hash()) + cltest.RequireTxSuccessful(t, b.Client(), tx.Hash()) mockServerUSD2 := cltest.NewHTTPMockServer(t, 200, "GET", `{"USD": 614.64}`) tx, err = operatorContracts.singleWord.RequestMultipleParametersWithCustomURLs(operatorContracts.user, mockServerUSD2.URL, "USD", @@ -454,7 +455,7 @@ func TestIntegration_DirectRequest(t *testing.T) { ) require.NoError(t, err) b.Commit() - cltest.RequireTxSuccessful(t, b, tx.Hash()) + cltest.RequireTxSuccessful(t, b.Client(), tx.Hash()) pipelineRuns = cltest.WaitForPipelineComplete(t, 0, jobSingleWord.ID, 1, 8, app.JobORM(), testutils.WaitTimeout(t), time.Second) pipelineRun = pipelineRuns[0] @@ -481,12 +482,12 @@ func setupAppForEthTx(t *testing.T, operatorContracts OperatorContracts) (app *c require.Len(t, sendingKeys, 1) // Fund node account with ETH. - n, err := b.NonceAt(testutils.Context(t), operatorContracts.user.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), operatorContracts.user.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction(n, sendingKeys[0].Address, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := operatorContracts.user.Signer(operatorContracts.user.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() @@ -644,10 +645,10 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, co } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) b := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b) + linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b.Client()) require.NoError(t, err) accessAddress, _, _, err := - testoffchainaggregator.DeploySimpleWriteAccessController(owner, b) + testoffchainaggregator.DeploySimpleWriteAccessController(owner, b.Client()) require.NoError(t, err, "failed to deploy test access controller contract") b.Commit() @@ -655,7 +656,7 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, co min.Exp(big.NewInt(-2), big.NewInt(191), nil) max.Exp(big.NewInt(2), big.NewInt(191), nil) max.Sub(max, big.NewInt(1)) - ocrContractAddress, _, ocrContract, err := offchainaggregator.DeployOffchainAggregator(owner, b, + ocrContractAddress, _, ocrContract, err := offchainaggregator.DeployOffchainAggregator(owner, b.Client(), 1000, // _maximumGasPrice uint32, 200, //_reasonableGasPrice uint32, 3.6e7, // 3.6e7 microLINK, or 36 LINK @@ -672,7 +673,7 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, co _, err = linkContract.Transfer(owner, ocrContractAddress, big.NewInt(1000)) require.NoError(t, err) - flagsContractAddress, _, flagsContract, err := flags_wrapper.DeployFlags(owner, b, owner.From) + flagsContractAddress, _, flagsContract, err := flags_wrapper.DeployFlags(owner, b.Client(), owner.From) require.NoError(t, err, "failed to deploy flags contract to simulated ethereum blockchain") b.Commit() @@ -711,13 +712,13 @@ func setupNode(t *testing.T, owner *bind.TransactOpts, portV2 int, transmitter := sendingKeys[0].Address // Fund the transmitter address with some ETH - n, err := b.NonceAt(testutils.Context(t), owner.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction(n, transmitter, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() @@ -754,13 +755,13 @@ func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 in transmitter := sendingKeys[0].Address // Fund the transmitter address with some ETH - n, err := b.NonceAt(testutils.Context(t), owner.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction(n, transmitter, assets.Ether(100).ToInt(), 21000, big.NewInt(1000000000), nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() @@ -768,7 +769,7 @@ func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 in require.NoError(t, err) // deploy a forwarder - forwarder, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b, common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) + forwarder, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) require.NoError(t, err) // set EOA as an authorized sender for the forwarder @@ -778,7 +779,7 @@ func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 in // add forwarder address to be tracked in db forwarderORM := forwarders.NewORM(app.GetDB()) - chainID, err := b.ChainID(testutils.Context(t)) + chainID, err := b.Client().ChainID(testutils.Context(t)) require.NoError(t, err) _, err = forwarderORM.CreateForwarder(testutils.Context(t), forwarder, ubig.Big(*chainID)) require.NoError(t, err) diff --git a/core/internal/features/ocr2/features_ocr2_test.go b/core/internal/features/ocr2/features_ocr2_test.go index a210c4ad3be..914abcd50d9 100644 --- a/core/internal/features/ocr2/features_ocr2_test.go +++ b/core/internal/features/ocr2/features_ocr2_test.go @@ -70,9 +70,9 @@ func setupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, c genesisData := types.GenesisAlloc{owner.From: {Balance: sb}} gasLimit := ethconfig.Defaults.Miner.GasCeil * 2 b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(gasLimit)) - linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b) + linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b.Client()) require.NoError(t, err) - accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(owner, b) + accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(owner, b.Client()) require.NoError(t, err, "failed to deploy test access controller contract") b.Commit() @@ -82,7 +82,7 @@ func setupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, c maxAnswer.Sub(maxAnswer, big.NewInt(1)) ocrContractAddress, _, ocrContract, err := ocr2aggregator.DeployOCR2Aggregator( owner, - b, + b.Client(), linkTokenAddress, //_link common.Address, minAnswer, // -2**191 maxAnswer, // 2**191 - 1 @@ -142,7 +142,7 @@ func setupNodeOCR2( effectiveTransmitter := sendingKeys[0].Address // Fund the transmitter address with some ETH - n, err := b.NonceAt(testutils.Context(t), owner.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction( @@ -153,7 +153,7 @@ func setupNodeOCR2( nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() @@ -162,7 +162,7 @@ func setupNodeOCR2( if useForwarder { // deploy a forwarder - faddr, _, authorizedForwarder, err2 := authorized_forwarder.DeployAuthorizedForwarder(owner, b, common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) + faddr, _, authorizedForwarder, err2 := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) require.NoError(t, err2) // set EOA as an authorized sender for the forwarder @@ -172,7 +172,7 @@ func setupNodeOCR2( // add forwarder address to be tracked in db forwarderORM := forwarders.NewORM(app.GetDB()) - chainID, err := b.ChainID(testutils.Context(t)) + chainID, err := b.Client().ChainID(testutils.Context(t)) require.NoError(t, err) _, err2 = forwarderORM.CreateForwarder(testutils.Context(t), faddr, ubig.Big(*chainID)) require.NoError(t, err2) @@ -636,7 +636,7 @@ func initOCR2(t *testing.T, lggr logger.Logger, b *simulated.Backend, payees, ) require.NoError(t, err) - blockBeforeConfig, err = b.BlockByNumber(testutils.Context(t), nil) + blockBeforeConfig, err = b.Client().BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) signers, effectiveTransmitters, threshold, _, encodedConfigVersion, encodedConfig, err := confighelper2.ContractSetConfigArgsForEthereumIntegrationTest( oracles, diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index cba665737ee..9c5b972c0e4 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -129,10 +130,10 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg require.NoError(t, err, "could not parse FluxAggregator ABI") var linkAddress common.Address - linkAddress, _, f.linkContract, err = link_token_interface.DeployLinkToken(f.sergey, f.backend) + linkAddress, _, f.linkContract, err = link_token_interface.DeployLinkToken(f.sergey, f.backend.Client()) require.NoError(t, err, "failed to deploy link contract to simulated ethereum blockchain") - f.flagsContractAddress, _, f.flagsContract, err = flags_wrapper.DeployFlags(f.sergey, f.backend, f.sergey.From) + f.flagsContractAddress, _, f.flagsContract, err = flags_wrapper.DeployFlags(f.sergey, f.backend.Client(), f.sergey.From) require.NoError(t, err, "failed to deploy flags contract to simulated ethereum blockchain") f.backend.Commit() @@ -147,7 +148,7 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg f.sergey.GasLimit = uint64(gasLimit) f.aggregatorContractAddress, _, f.aggregatorContract, err = faw.DeployFluxAggregator( f.sergey, - f.backend, + f.backend.Client(), linkAddress, big.NewInt(fee), faTimeout, @@ -251,7 +252,7 @@ type answerParams struct { func checkSubmission(t *testing.T, p answerParams, currentBalance int64, receiptBlock uint64) { t.Helper() if receiptBlock == 0 { - h, err := p.fa.backend.HeaderByNumber(testutils.Context(t), nil) + h, err := p.fa.backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) receiptBlock = h.Number.Uint64() } @@ -416,7 +417,7 @@ func checkLogWasConsumed(t *testing.T, fa fluxAggregatorUniverse, ds sqlutil.Dat g := gomega.NewWithT(t) g.Eventually(func() bool { ctx := testutils.Context(t) - block, err := fa.backend.BlockByNumber(ctx, big.NewInt(int64(blockNumber))) + block, err := fa.backend.Client().BlockByNumber(ctx, big.NewInt(int64(blockNumber))) require.NoError(t, err) require.NotNil(t, block) orm := log.NewORM(ds, fa.evmChainID) diff --git a/core/services/keeper/integration_test.go b/core/services/keeper/integration_test.go index dc68d896649..6c026e1b29a 100644 --- a/core/services/keeper/integration_test.go +++ b/core/services/keeper/integration_test.go @@ -250,7 +250,7 @@ func TestKeeperEthIntegration(t *testing.T) { }) korm := keeper.NewORM(db, logger.TestLogger(t)) - app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey) + app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b, nodeKey) require.NoError(t, app.Start(ctx)) // create job @@ -410,7 +410,7 @@ func TestKeeperForwarderEthIntegration(t *testing.T) { }) korm := keeper.NewORM(db, logger.TestLogger(t)) - app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey) + app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b, nodeKey) require.NoError(t, app.Start(ctx)) forwarderORM := forwarders.NewORM(db) @@ -554,7 +554,7 @@ func TestMaxPerformDataSize(t *testing.T) { }) korm := keeper.NewORM(db, logger.TestLogger(t)) - app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.Backend(), nodeKey) + app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b, nodeKey) require.NoError(t, app.Start(ctx)) // create job diff --git a/core/services/ocr2/plugins/mercury/helpers_test.go b/core/services/ocr2/plugins/mercury/helpers_test.go index d35165f5c99..58bde79587e 100644 --- a/core/services/ocr2/plugins/mercury/helpers_test.go +++ b/core/services/ocr2/plugins/mercury/helpers_test.go @@ -13,6 +13,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go index 26b6d139ed6..4b66ba8b308 100644 --- a/core/services/ocr2/plugins/mercury/integration_test.go +++ b/core/services/ocr2/plugins/mercury/integration_test.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" @@ -97,23 +98,23 @@ func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *ver t.Cleanup(stopMining) // Deploy contracts - linkTokenAddress, _, linkToken, err := token.DeployLinkToken(steve, backend) + linkTokenAddress, _, linkToken, err := token.DeployLinkToken(steve, backend.Client()) require.NoError(t, err) _, err = linkToken.Transfer(steve, steve.From, big.NewInt(1000)) require.NoError(t, err) - nativeTokenAddress, _, nativeToken, err := token.DeployLinkToken(steve, backend) + nativeTokenAddress, _, nativeToken, err := token.DeployLinkToken(steve, backend.Client()) require.NoError(t, err) _, err = nativeToken.Transfer(steve, steve.From, big.NewInt(1000)) require.NoError(t, err) - verifierProxyAddr, _, verifierProxy, err := verifier_proxy.DeployVerifierProxy(steve, backend, common.Address{}) // zero address for access controller disables access control + verifierProxyAddr, _, verifierProxy, err := verifier_proxy.DeployVerifierProxy(steve, backend.Client(), common.Address{}) // zero address for access controller disables access control require.NoError(t, err) - verifierAddress, _, verifier, err := verifier.DeployVerifier(steve, backend, verifierProxyAddr) + verifierAddress, _, verifier, err := verifier.DeployVerifier(steve, backend.Client(), verifierProxyAddr) require.NoError(t, err) _, err = verifierProxy.InitializeVerifier(steve, verifierAddress) require.NoError(t, err) - rewardManagerAddr, _, rewardManager, err := reward_manager.DeployRewardManager(steve, backend, linkTokenAddress) + rewardManagerAddr, _, rewardManager, err := reward_manager.DeployRewardManager(steve, backend.Client(), linkTokenAddress) require.NoError(t, err) - feeManagerAddr, _, _, err := fee_manager.DeployFeeManager(steve, backend, linkTokenAddress, nativeTokenAddress, verifierProxyAddr, rewardManagerAddr) + feeManagerAddr, _, _, err := fee_manager.DeployFeeManager(steve, backend.Client(), linkTokenAddress, nativeTokenAddress, verifierProxyAddr, rewardManagerAddr) require.NoError(t, err) _, err = verifierProxy.SetFeeManager(steve, feeManagerAddr) require.NoError(t, err) @@ -371,7 +372,7 @@ func integration_MercuryV1(t *testing.T) { num, err := (&reportcodecv1.ReportCodec{}).CurrentBlockNumFromReport(ocr2types.Report(report.([]byte))) require.NoError(t, err) - currentBlock, err := backend.BlockByNumber(testutils.Context(t), nil) + currentBlock, err := backend.Client().BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) assert.GreaterOrEqual(t, currentBlock.Number().Int64(), num) @@ -435,7 +436,7 @@ func integration_MercuryV1(t *testing.T) { num, err := (&reportcodecv1.ReportCodec{}).CurrentBlockNumFromReport(ocr2types.Report(report.([]byte))) require.NoError(t, err) - currentBlock, err := backend.BlockByNumber(testutils.Context(t), nil) + currentBlock, err := backend.Client().BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) assert.GreaterOrEqual(t, currentBlock.Number().Int64(), num) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index a64adea158e..219d737c52d 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -20,6 +20,7 @@ import ( "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" @@ -110,11 +111,11 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) { defer stopMining() // Deploy registry - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -128,7 +129,7 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) { require.NoError(t, err) // Register new upkeep - upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend) + upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend.Client()) require.NoError(t, err) registrationTx, err := registry.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, 0, []byte{}, []byte{}, []byte{}) require.NoError(t, err) @@ -211,11 +212,11 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { defer stopMining() // Deploy registry - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -258,7 +259,7 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { } }) - h, err := backend.HeaderByNumber(testutils.Context(t), nil) + h, err := backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) beforeDummyBlocks := h.Number.Uint64() @@ -320,13 +321,13 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { defer stopMining() // Deploy registry - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -455,13 +456,13 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { defer stopMining() // Deploy registry - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -509,7 +510,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)) - h, err := backend.HeaderByNumber(testutils.Context(t), nil) + h, err := backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) startBlock := h.Number.Int64() // start emitting events in a separate go-routine @@ -599,7 +600,7 @@ func listenPerformedN(t *testing.T, backend *simulated.Backend, registry *iregis go func() { for ctx.Err() == nil { - h, err := backend.HeaderByNumber(testutils.Context(t), nil) + h, err := backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) currentBlock := h.Number.Uint64() @@ -812,7 +813,7 @@ func deployUpkeeps(t *testing.T, backend *simulated.Backend, carrol, steve *bind backend.Commit() time.Sleep(1 * time.Second) upkeepAddr, _, upkeepContract, err := log_upkeep_counter_wrapper.DeployLogUpkeepCounter( - carrol, backend, + carrol, backend.Client(), big.NewInt(100000), ) require.NoError(t, err) @@ -860,12 +861,12 @@ func deployKeeper21Registry( linkAddr, linkFeedAddr, gasFeedAddr common.Address, ) *iregistry21.IKeeperRegistryMaster { - automationForwarderLogicAddr, _, _, err := automationForwarderLogic.DeployAutomationForwarderLogic(auth, backend) + automationForwarderLogicAddr, _, _, err := automationForwarderLogic.DeployAutomationForwarderLogic(auth, backend.Client()) require.NoError(t, err) backend.Commit() registryLogicBAddr, _, _, err := registrylogicb21.DeployKeeperRegistryLogicB( auth, - backend, + backend.Client(), 0, // Payment model linkAddr, linkFeedAddr, @@ -877,7 +878,7 @@ func deployKeeper21Registry( registryLogicAAddr, _, _, err := registrylogica21.DeployKeeperRegistryLogicA( auth, - backend, + backend.Client(), registryLogicBAddr, ) require.NoError(t, err) @@ -885,20 +886,20 @@ func deployKeeper21Registry( registryAddr, _, _, err := registry21.DeployKeeperRegistry( auth, - backend, + backend.Client(), registryLogicAAddr, ) require.NoError(t, err) backend.Commit() - registryMaster, err := iregistry21.NewIKeeperRegistryMaster(registryAddr, backend) + registryMaster, err := iregistry21.NewIKeeperRegistryMaster(registryAddr, backend.Client()) require.NoError(t, err) return registryMaster } func getUpkeepIdFromTx21(t *testing.T, registry *iregistry21.IKeeperRegistryMaster, registrationTx *gethtypes.Transaction, backend *simulated.Backend) *big.Int { - receipt, err := backend.TransactionReceipt(testutils.Context(t), registrationTx.Hash()) + receipt, err := backend.Client().TransactionReceipt(testutils.Context(t), registrationTx.Hash()) require.NoError(t, err) parsedLog, err := registry.ParseUpkeepRegistered(*receipt.Logs[0]) require.NoError(t, err) @@ -930,7 +931,7 @@ func registerAndFund( backend.Commit() - receipt, err := backend.TransactionReceipt(testutils.Context(t), registrationTx.Hash()) + receipt, err := backend.Client().TransactionReceipt(testutils.Context(t), registrationTx.Hash()) require.NoError(t, err) parsedLog, err := registry.ParseUpkeepRegistered(*receipt.Logs[0]) @@ -969,7 +970,7 @@ func newFeedLookupUpkeepController( backend *simulated.Backend, protocolOwner *bind.TransactOpts, ) (*feedLookupUpkeepController, error) { - addr, _, contract, err := dummy_protocol_wrapper.DeployDummyProtocol(protocolOwner, backend) + addr, _, contract, err := dummy_protocol_wrapper.DeployDummyProtocol(protocolOwner, backend.Client()) if err != nil { return nil, err } @@ -1001,7 +1002,7 @@ func (c *feedLookupUpkeepController) DeployUpkeeps( } addr, _, contract, err := log_triggered_streams_lookup_wrapper.DeployLogTriggeredStreamsLookup( owner, - backend, + backend.Client(), false, false, checkErrResult, @@ -1102,7 +1103,7 @@ func (c *feedLookupUpkeepController) EnableMercury( require.True(t, checkBytes.MercuryEnabled) } - bl, _ := backend.BlockByHash(testutils.Context(t), backend.Commit()) + bl, _ := backend.Client().BlockByHash(testutils.Context(t), backend.Commit()) t.Logf("block number after mercury enabled: %d", bl.NumberU64()) return nil @@ -1171,7 +1172,7 @@ func (c *feedLookupUpkeepController) EmitEvents( backend.Commit() // verify event was emitted - block, _ := backend.BlockByHash(ctx, backend.Commit()) + block, _ := backend.Client().BlockByHash(ctx, backend.Commit()) t.Logf("block number after emit event: %d", block.NumberU64()) iter, _ := c.protocol.FilterLimitOrderExecuted( diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index 6e746e85866..6cd30e6d215 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -16,6 +16,7 @@ import ( "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/onsi/gomega" "github.com/pkg/errors" @@ -81,7 +82,7 @@ func deployKeeper20Registry( ) *keeper_registry_wrapper2_0.KeeperRegistry { logicAddr, _, _, err := keeper_registry_logic2_0.DeployKeeperRegistryLogic( auth, - backend, + backend.Client(), 0, // Payment model linkAddr, linkFeedAddr, @@ -91,13 +92,13 @@ func deployKeeper20Registry( regAddr, _, _, err := keeper_registry_wrapper2_0.DeployKeeperRegistry( auth, - backend, + backend.Client(), logicAddr, ) require.NoError(t, err) backend.Commit() - registry, err := keeper_registry_wrapper2_0.NewKeeperRegistry(regAddr, backend) + registry, err := keeper_registry_wrapper2_0.NewKeeperRegistry(regAddr, backend.Client()) require.NoError(t, err) return registry @@ -192,7 +193,7 @@ func accountsToAddress(accounts []ocrTypes.Account) (addresses []common.Address, } func getUpkeepIdFromTx(t *testing.T, registry *keeper_registry_wrapper2_0.KeeperRegistry, registrationTx *gethtypes.Transaction, backend *simulated.Backend) *big.Int { - receipt, err := backend.TransactionReceipt(testutils.Context(t), registrationTx.Hash()) + receipt, err := backend.Client().TransactionReceipt(testutils.Context(t), registrationTx.Hash()) require.NoError(t, err) parsedLog, err := registry.ParseUpkeepRegistered(*receipt.Logs[0]) require.NoError(t, err) @@ -224,11 +225,11 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { defer stopMining() // Deploy contracts - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper20Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -376,7 +377,7 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { backend.Commit() // Register new upkeep - upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend) + upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend.Client()) require.NoError(t, err) registrationTx, err := registry.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}, []byte{}) require.NoError(t, err) @@ -426,7 +427,7 @@ func setupForwarderForNode( backend *simulated.Backend, recipient common.Address, linkAddr common.Address) common.Address { - faddr, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(caller, backend, linkAddr, caller.From, recipient, []byte{}) + faddr, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(caller, backend.Client(), linkAddr, caller.From, recipient, []byte{}) require.NoError(t, err) // set EOA as an authorized sender for the forwarder @@ -436,7 +437,7 @@ func setupForwarderForNode( // add forwarder address to be tracked in db forwarderORM := forwarders.NewORM(app.GetDB()) - chainID, err := backend.ChainID(testutils.Context(t)) + chainID, err := backend.Client().ChainID(testutils.Context(t)) require.NoError(t, err) _, err = forwarderORM.CreateForwarder(testutils.Context(t), faddr, ubig.Big(*chainID)) require.NoError(t, err) @@ -475,11 +476,11 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { defer stopMining() // Deploy contracts - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend.Client()) require.NoError(t, err) - gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000)) + gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(60000000000)) require.NoError(t, err) - linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000)) + linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend.Client(), 18, big.NewInt(2000000000000000000)) require.NoError(t, err) registry := deployKeeper20Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr) @@ -639,7 +640,7 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { backend.Commit() // Register new upkeep - upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend) + upkeepAddr, _, upkeepContract, err := basic_upkeep_contract.DeployBasicUpkeepContract(carrol, backend.Client()) require.NoError(t, err) registrationTx, err := registry.RegisterUpkeep(steve, upkeepAddr, 2_500_000, carrol.From, []byte{}, []byte{}) require.NoError(t, err) diff --git a/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go b/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go index bd9e118d4c6..ee722587de6 100644 --- a/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go +++ b/core/services/ocr2/plugins/ocr2vrf/internal/ocr2vrf_integration_test.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" @@ -102,7 +102,7 @@ func setupOCR2VRFContracts( t *testing.T, beaconPeriod int64, keyID [32]byte, consumerShouldFail bool) ocr2vrfUniverse { owner := testutils.MustNewSimTransactor(t) owner.GasPrice = assets.GWei(1).ToInt() - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ owner.From: { Balance: assets.Ether(100).ToInt(), }, @@ -116,21 +116,21 @@ func setupOCR2VRFContracts( // * VRF (coordinator, and beacon) // * VRF consumer linkAddress, _, link, err := link_token_interface.DeployLinkToken( - owner, b) + owner, b.Client()) require.NoError(t, err) b.Commit() feedAddress, _, feed, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( - owner, b, 18, assets.GWei(int(1e7)).ToInt()) // 0.01 eth per link + owner, b.Client(), 18, assets.GWei(int(1e7)).ToInt()) // 0.01 eth per link require.NoError(t, err) b.Commit() - dkgAddress, _, dkg, err := dkg_wrapper.DeployDKG(owner, b) + dkgAddress, _, dkg, err := dkg_wrapper.DeployDKG(owner, b.Client()) require.NoError(t, err) b.Commit() coordinatorAddress, _, coordinator, err := vrf_wrapper.DeployVRFCoordinator( - owner, b, big.NewInt(beaconPeriod), linkAddress) + owner, b.Client(), big.NewInt(beaconPeriod), linkAddress) require.NoError(t, err) b.Commit() @@ -149,17 +149,17 @@ func setupOCR2VRFContracts( b.Commit() beaconAddress, _, beacon, err := vrf_beacon.DeployVRFBeacon( - owner, b, linkAddress, coordinatorAddress, dkgAddress, keyID) + owner, b.Client(), linkAddress, coordinatorAddress, dkgAddress, keyID) require.NoError(t, err) b.Commit() consumerAddress, _, consumer, err := vrf_beacon_consumer.DeployBeaconVRFConsumer( - owner, b, coordinatorAddress, consumerShouldFail, big.NewInt(beaconPeriod)) + owner, b.Client(), coordinatorAddress, consumerShouldFail, big.NewInt(beaconPeriod)) require.NoError(t, err) b.Commit() loadTestConsumerAddress, _, loadTestConsumer, err := load_test_beacon_consumer.DeployLoadTestBeaconVRFConsumer( - owner, b, coordinatorAddress, consumerShouldFail, big.NewInt(beaconPeriod)) + owner, b.Client(), coordinatorAddress, consumerShouldFail, big.NewInt(beaconPeriod)) require.NoError(t, err) b.Commit() @@ -277,7 +277,7 @@ func setupNodeOCR2( require.Len(t, sendingKeys, 2) // Deploy a forwarder. - faddr, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b, common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) + faddr, _, authorizedForwarder, err := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{}) require.NoError(t, err) // Set the node's sending keys as authorized senders. @@ -297,7 +297,7 @@ func setupNodeOCR2( var sendingKeyStrings []string for _, k := range sendingKeys { sendingKeyStrings = append(sendingKeyStrings, k.Address.String()) - n, err := b.NonceAt(ctx, owner.From, nil) + n, err := b.Client().NonceAt(ctx, owner.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction( @@ -308,7 +308,7 @@ func setupNodeOCR2( nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = b.SendTransaction(ctx, signedTx) + err = b.Client().SendTransaction(ctx, signedTx) require.NoError(t, err) b.Commit() } @@ -411,7 +411,7 @@ func runOCR2VRFTest(t *testing.T, useForwarders bool) { } }() - blockBeforeConfig, err := uni.backend.BlockByNumber(ctx, nil) + blockBeforeConfig, err := uni.backend.Client().BlockByNumber(ctx, nil) require.NoError(t, err) t.Log("Setting DKG config before block:", blockBeforeConfig.Number().String()) @@ -662,7 +662,7 @@ linkEthFeedAddress = "%s" totalNopPayout := new(big.Int) for idx, payeeTransactor := range payeeTransactors { // Fund the payee with some ETH. - n, err2 := uni.backend.NonceAt(ctx, uni.owner.From, nil) + n, err2 := uni.backend.Client().NonceAt(ctx, uni.owner.From, nil) require.NoError(t, err2) tx := cltest.NewLegacyTransaction( n, payeeTransactor.From, @@ -672,7 +672,7 @@ linkEthFeedAddress = "%s" nil) signedTx, err2 := uni.owner.Signer(uni.owner.From, tx) require.NoError(t, err2) - err2 = uni.backend.SendTransaction(ctx, signedTx) + err2 = uni.backend.Client().SendTransaction(ctx, signedTx) require.NoError(t, err2) _, err2 = uni.beacon.WithdrawPayment(payeeTransactor, transmitters[idx]) diff --git a/core/services/relay/evm/functions/config_poller_test.go b/core/services/relay/evm/functions/config_poller_test.go index 9f4a9465246..dd16245464e 100644 --- a/core/services/relay/evm/functions/config_poller_test.go +++ b/core/services/relay/evm/functions/config_poller_test.go @@ -57,9 +57,9 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig user.From: {Balance: big.NewInt(1000000000000000000)}}, simulated.WithBlockGasLimit(5*ethconfig.Defaults.Miner.GasCeil)) defer b.Close() - linkTokenAddress, _, _, err := link_token_interface.DeployLinkToken(user, b) + linkTokenAddress, _, _, err := link_token_interface.DeployLinkToken(user, b.Client()) require.NoError(t, err) - accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(user, b) + accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(user, b.Client()) require.NoError(t, err, "failed to deploy test access controller contract") ocrAddress, _, ocrContract, err := ocr2aggregator.DeployOCR2Aggregator( user, @@ -122,7 +122,7 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig // Set the config contractConfig := setFunctionsConfig(t, pluginConfig, ocrContract, user) b.Commit() - latest, err := b.BlockByNumber(testutils.Context(t), nil) + latest, err := b.Client().BlockByNumber(testutils.Context(t), nil) require.NoError(t, err) // Ensure we capture this config set log. require.NoError(t, lp.Replay(testutils.Context(t), latest.Number().Int64()-1)) diff --git a/core/services/transmission/integration_test.go b/core/services/transmission/integration_test.go index b294772bcbc..805e6923ecb 100644 --- a/core/services/transmission/integration_test.go +++ b/core/services/transmission/integration_test.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" @@ -77,26 +78,26 @@ func deployTransmissionUniverse(t *testing.T) *EntryPointUniverse { backend.Commit() // Setup all contracts and addresses used by tests. - entryPointAddress, _, entryPoint, err := entry_point.DeployEntryPoint(holder1, backend) + entryPointAddress, _, entryPoint, err := entry_point.DeployEntryPoint(holder1, backend.Client()) require.NoError(t, err) - factoryAddress, _, _, _ := smart_contract_account_factory.DeploySmartContractAccountFactory(holder1, backend) + factoryAddress, _, _, _ := smart_contract_account_factory.DeploySmartContractAccountFactory(holder1, backend.Client()) require.NoError(t, err) - _, _, helper, err := smart_contract_account_helper.DeploySmartContractAccountHelper(holder1, backend) + _, _, helper, err := smart_contract_account_helper.DeploySmartContractAccountHelper(holder1, backend.Client()) require.NoError(t, err) - greeterAddress, _, greeter, err := greeter_wrapper.DeployGreeter(holder1, backend) + greeterAddress, _, greeter, err := greeter_wrapper.DeployGreeter(holder1, backend.Client()) require.NoError(t, err) - linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend) + linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend.Client()) require.NoError(t, err) linkEthFeedAddress, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( holder1, - backend, + backend.Client(), 18, (*big.Int)(assets.GWei(5000000)), // .005 ETH ) require.NoError(t, err) - vrfCoordinatorAddress, _, vrfCoordinator, err := vrf_coordinator_mock.DeployVRFCoordinatorMock(holder1, backend, linkTokenAddress) + vrfCoordinatorAddress, _, vrfCoordinator, err := vrf_coordinator_mock.DeployVRFCoordinatorMock(holder1, backend.Client(), linkTokenAddress) require.NoError(t, err) - vrfConsumerAddress, _, _, err := solidity_vrf_consumer_interface_v08.DeployVRFConsumer(holder1, backend, vrfCoordinatorAddress, linkTokenAddress) + vrfConsumerAddress, _, _, err := solidity_vrf_consumer_interface_v08.DeployVRFConsumer(holder1, backend.Client(), vrfCoordinatorAddress, linkTokenAddress) require.NoError(t, err) backend.Commit() @@ -193,7 +194,7 @@ func Test4337Basic(t *testing.T) { tx, err := universe.entryPoint.DepositTo(holder1, toDeployAddress) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) holder1.Value = assets.Ether(0).ToInt() balance, err := universe.entryPoint.BalanceOf(nil, toDeployAddress) @@ -204,7 +205,7 @@ func Test4337Basic(t *testing.T) { tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) // Ensure "bye" was successfully set as the greeting. @@ -213,7 +214,7 @@ func Test4337Basic(t *testing.T) { require.Equal(t, "bye", greetingResult) // Assert smart contract account is created and nonce incremented. - sca, err := sca_wrapper.NewSCA(toDeployAddress, backend) + sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client()) require.NoError(t, err) onChainNonce, err := sca.SNonce(nil) require.NoError(t, err) @@ -263,16 +264,16 @@ func Test4337WithLinkTokenPaymaster(t *testing.T) { t.Log("Full user operation calldata:", common.Bytes2Hex(fullEncoding)) // Deposit to LINK paymaster. - linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend) + linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend.Client()) require.NoError(t, err) linkEthFeedAddress, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract( holder1, - backend, + backend.Client(), 18, (*big.Int)(assets.GWei(5000000)), // .005 ETH ) require.NoError(t, err) - paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend, linkTokenAddress, linkEthFeedAddress, universe.entryPointAddress) + paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend.Client(), linkTokenAddress, linkEthFeedAddress, universe.entryPointAddress) require.NoError(t, err) backend.Commit() tx, err := linkToken.TransferAndCall( @@ -283,7 +284,7 @@ func Test4337WithLinkTokenPaymaster(t *testing.T) { ) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) // Construct and execute user operation. @@ -317,7 +318,7 @@ func Test4337WithLinkTokenPaymaster(t *testing.T) { tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) holder1.Value = assets.Ether(0).ToInt() balance, err := universe.entryPoint.BalanceOf(nil, paymasterAddress) @@ -328,7 +329,7 @@ func Test4337WithLinkTokenPaymaster(t *testing.T) { tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) // Ensure "bye" was successfully set as the greeting. @@ -337,7 +338,7 @@ func Test4337WithLinkTokenPaymaster(t *testing.T) { require.Equal(t, "bye", greetingResult) // Assert smart contract account is created and nonce incremented. - sca, err := sca_wrapper.NewSCA(toDeployAddress, backend) + sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client()) require.NoError(t, err) onChainNonce, err := sca.SNonce(nil) require.NoError(t, err) @@ -385,7 +386,7 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { t.Log("Full user operation calldata:", common.Bytes2Hex(fullEncoding)) // Deposit to LINK paymaster. - paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend, universe.linkTokenAddress, universe.linkEthFeedAddress, universe.entryPointAddress) + paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend.Client(), universe.linkTokenAddress, universe.linkEthFeedAddress, universe.entryPointAddress) require.NoError(t, err) backend.Commit() tx, err := universe.linkToken.TransferAndCall( @@ -396,7 +397,7 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { ) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) // Generate encoded paymaster data to fund the VRF consumer. @@ -434,7 +435,7 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress) require.NoError(t, err) backend.Commit() - _, err = bind.WaitMined(testutils.Context(t), backend, tx) + _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx) require.NoError(t, err) holder1.Value = assets.Ether(0).ToInt() balance, err := universe.entryPoint.BalanceOf(nil, paymasterAddress) @@ -443,13 +444,13 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { // Run handleOps from holder2's account, to demonstrate that any account can execute this signed user operation. // Manually execute transaction to test ABI packing. - gasPrice, err := backend.SuggestGasPrice(testutils.Context(t)) + gasPrice, err := backend.Client().SuggestGasPrice(testutils.Context(t)) require.NoError(t, err) - accountNonce, err := backend.PendingNonceAt(testutils.Context(t), holder2.From) + accountNonce, err := backend.Client().PendingNonceAt(testutils.Context(t), holder2.From) require.NoError(t, err) payload, err := entrypointABI.Pack("handleOps", []entry_point.UserOperation{userOp}, holder1.From) require.NoError(t, err) - gas, err := backend.EstimateGas(testutils.Context(t), ethereum.CallMsg{ + gas, err := backend.Client().EstimateGas(testutils.Context(t), ethereum.CallMsg{ From: holder2.From, To: &universe.entryPointAddress, Gas: 0, @@ -467,15 +468,15 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { require.NoError(t, err) signedtx, err := holder2.Signer(holder2.From, unsigned) require.NoError(t, err) - err = backend.SendTransaction(testutils.Context(t), signedtx) + err = backend.Client().SendTransaction(testutils.Context(t), signedtx) require.NoError(t, err) - backend.Commit() - receipt, err := bind.WaitMined(testutils.Context(t), backend, signedtx) + backend.Client() + receipt, err := bind.WaitMined(testutils.Context(t), backend.Client(), signedtx) require.NoError(t, err) t.Log("Receipt:", receipt.Status) // Assert the VRF request was correctly made. - logs, err := backend.FilterLogs(testutils.Context(t), ethereum.FilterQuery{ + logs, err := backend.Client().FilterLogs(testutils.Context(t), ethereum.FilterQuery{ Addresses: []common.Address{universe.vrfCoordinatorAddress}, }) require.NoError(t, err) @@ -487,7 +488,7 @@ func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) { require.Equal(t, universe.vrfConsumerAddress, randomnessRequestLog.Sender) // Assert smart contract account is created and nonce incremented. - sca, err := sca_wrapper.NewSCA(toDeployAddress, backend) + sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client()) require.NoError(t, err) onChainNonce, err := sca.SNonce(nil) require.NoError(t, err) diff --git a/core/services/vrf/v1/integration_test.go b/core/services/vrf/v1/integration_test.go index f4352cb38c3..7e771df5523 100644 --- a/core/services/vrf/v1/integration_test.go +++ b/core/services/vrf/v1/integration_test.go @@ -16,6 +16,7 @@ import ( "gopkg.in/guregu/null.v4" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_coordinator_interface" @@ -116,11 +117,11 @@ func TestIntegration_VRF_JPV2(t *testing.T) { }, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue()) // Check that each sending address sent one transaction - n1, err := cu.Backend.PendingNonceAt(ctx, key1.Address) + n1, err := cu.Backend.Client().PendingNonceAt(ctx, key1.Address) require.NoError(t, err) require.EqualValues(t, 1, n1) - n2, err := cu.Backend.PendingNonceAt(ctx, key2.Address) + n2, err := cu.Backend.Client().PendingNonceAt(ctx, key2.Address) require.NoError(t, err) require.EqualValues(t, 1, n2) }) @@ -163,7 +164,7 @@ func TestIntegration_VRF_WithBHS(t *testing.T) { require.NoError(t, err) cu.Backend.Commit() - h, err := cu.Backend.HeaderByNumber(testutils.Context(t), nil) + h, err := cu.Backend.Client().HeaderByNumber(testutils.Context(t), nil) require.NoError(t, err) requestBlock := h.Number From 44ad07223ee72773fa5a8b8d188f7d9ef3c7893b Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 20:03:48 -0700 Subject: [PATCH 23/30] re-generate KeystoneForwarder --- .../keystone/generated/forwarder/forwarder.go | 204 ++++++++++++++++-- 1 file changed, 188 insertions(+), 16 deletions(-) diff --git a/core/gethwrappers/keystone/generated/forwarder/forwarder.go b/core/gethwrappers/keystone/generated/forwarder/forwarder.go index c66e2886793..fbdd024c64f 100644 --- a/core/gethwrappers/keystone/generated/forwarder/forwarder.go +++ b/core/gethwrappers/keystone/generated/forwarder/forwarder.go @@ -31,8 +31,8 @@ var ( ) var KeystoneForwarderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b610c12806101576000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063c0965dc311610050578063c0965dc314610108578063e6b714581461012b578063f2fde38b1461016157600080fd5b8063181f5a771461007757806379ba5097146100bf5780638da5cb5b146100c9575b600080fd5b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100b69190610827565b60405180910390f35b6100c7610174565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b6565b61011b6101163660046108bc565b610276565b60405190151581526020016100b6565b6100e3610139366004610998565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6100c761016f3660046109b1565b61058e565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60025460009060ff16156102b6576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556044841161034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e6774680000000000000000000000000060448201526064016101f1565b600061035a85600481896109d3565b8101906103679190610a2c565b8051602082012090915060005b848110156104655760008060006103e289898681811061039657610396610afb565b90506020028101906103a89190610b2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a292505050565b925092509250600060018683868660405160008152602001604052604051610426949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610448573d6000803e3d6000fd5b5086955061045d9450859350610b9692505050565b915050610374565b5060008061047284610630565b600081815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff16156104ae57600094505050505061055d565b6000808b73ffffffffffffffffffffffffffffffffffffffff168b8b6040516104d8929190610bf5565b6000604051808303816000865af19150503d8060008114610515576040519150601f19603f3d011682016040523d82523d6000602084013e61051a565b606091505b5050506000928352505060036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001925050505b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905595945050505050565b6105966106af565b61059f81610732565b50565b60008060008351604114610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016101f1565b50505060208101516040820151606090920151909260009190911a90565b600080604083511161069e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207265706f7274206c656e677468000000000000000000000060448201526064016101f1565b505060208101516040909101519091565b60005473ffffffffffffffffffffffffffffffffffffffff163314610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016101f1565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016101f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208083528351808285015260005b8181101561085457858101830151858201604001528201610838565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b757600080fd5b919050565b6000806000806000606086880312156108d457600080fd5b6108dd86610893565b9450602086013567ffffffffffffffff808211156108fa57600080fd5b818801915088601f83011261090e57600080fd5b81358181111561091d57600080fd5b89602082850101111561092f57600080fd5b60208301965080955050604088013591508082111561094d57600080fd5b818801915088601f83011261096157600080fd5b81358181111561097057600080fd5b8960208260051b850101111561098557600080fd5b9699959850939650602001949392505050565b6000602082840312156109aa57600080fd5b5035919050565b6000602082840312156109c357600080fd5b6109cc82610893565b9392505050565b600080858511156109e357600080fd5b838611156109f057600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610a3e57600080fd5b813567ffffffffffffffff80821115610a5657600080fd5b818401915084601f830112610a6a57600080fd5b813581811115610a7c57610a7c6109fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ac257610ac26109fd565b81604052828152876020848701011115610adb57600080fd5b826020860160208301376000928101602001929092525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b5f57600080fd5b83018035915067ffffffffffffffff821115610b7a57600080fd5b602001915036819003821315610b8f57600080fd5b9250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818382376000910190815291905056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"InvalidDonId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"}],\"name\":\"ReportAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"ReportProcessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61151d806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806379ba50971161005b57806379ba5097146101175780638da5cb5b1461011f578063c0965dc31461013d578063f2fde38b1461015057600080fd5b8063134a46f014610082578063181f5a7714610097578063390d0b15146100df575b600080fd5b610095610090366004611106565b610163565b005b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100d691906111de565b60405180910390f35b6100f26100ed366004611221565b61057d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61009561060e565b60005473ffffffffffffffffffffffffffffffffffffffff166100f2565b61009561014b36600461124b565b61070b565b61009561015e3660046112fa565b610ded565b60015474010000000000000000000000000000000000000000900460ff16156101b8576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560ff8316600003610234576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f81111561027e576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101829052601f60248201526044015b60405180910390fd5b610289836003611344565b60ff1681116102e7578061029e846003611344565b6102a9906001611367565b6040517f9dd9e6d8000000000000000000000000000000000000000000000000000000008152600481019290925260ff166024820152604401610275565b60005b63ffffffff85166000908152600260205260409020600101548110156103885763ffffffff8516600090815260026020526040812060010180548390811061033457610334611380565b600091825260208083209091015463ffffffff891683526002808352604080852073ffffffffffffffffffffffffffffffffffffffff9093168552910190915281205550610381816113af565b90506102ea565b5063ffffffff841660009081526002602052604090206103ac906001018383610ffe565b5060005b8181101561050a5760008383838181106103cc576103cc611380565b90506020020160208101906103e191906112fa565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290920190529020549091501561046c576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610477826001611367565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616808552868401835290842060ff959095169094559081526001938401805494850181558252902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055610503816113af565b90506103b0565b50505063ffffffff91909116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b6000806105df84846040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff169150505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461068f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610275565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60015474010000000000000000000000000000000000000000900460ff1615610760576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560588310156107da576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061081f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e0192505050565b63ffffffff8316600090815260026020526040812054949850929650909450925060ff9091169003610885576040517fea1b312900000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610275565b604080517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260039092529190205473ffffffffffffffffffffffffffffffffffffffff1615610939576040517f1aac3d2900000000000000000000000000000000000000000000000000000000815260048101829052602401610275565b63ffffffff8416600090815260026020526040902054869061095f9060ff166001611367565b60ff16146109ca5763ffffffff841660009081526002602052604090205461098b9060ff166001611367565b6040517fd6022e8e00000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101879052604401610275565b600089896040516109dc9291906113e7565b604051809103902090506109ee611086565b6000805b89811015610c5c576000806000610a608e8e86818110610a1457610a14611380565b9050602002810190610a2691906113f7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2692505050565b925092509250600060018883868660405160008152602001604052604051610aa4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610ac6573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015163ffffffff8f1660009081526002602081815284832073ffffffffffffffffffffffffffffffffffffffff851684529091019052918220549850925060ff881690039050610b81576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610b8c60018761145c565b955060008760ff8816601f8110610ba557610ba5611380565b602002015173ffffffffffffffffffffffffffffffffffffffff1614610c0f576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b80878760ff16601f8110610c2557610c25611380565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015250610c5592508391506113af9050565b90506109f2565b5050505060008a905060008173ffffffffffffffffffffffffffffffffffffffff1663ff5a027088868e8e6058908092610c9893929190611475565b6040518563ffffffff1660e01b8152600401610cb7949392919061149f565b600060405180830381600087803b158015610cd157600080fd5b505af1925050508015610ce2575060015b15610ceb575060015b604080518082018252338152821515602080830191825260008781526003909152839020915182549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91821617919091179091559051869186811691908f16907fdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c208190610daf90861515815260200190565b60405180910390a45050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905550505050505050505050565b610df5610e86565b610dfe81610f09565b50565b602081015160408201516044830151606490930151919360e09190911c929160601c90565b60008060006041845114610e6857836040517f2adfdc3000000000000000000000000000000000000000000000000000000000815260040161027591906111de565b50505060208101516040820151606090920151909260009190911a90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610275565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610275565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611076579160200282015b828111156110765781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061101e565b506110829291506110a5565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561108257600081556001016110a6565b60008083601f8401126110cc57600080fd5b50813567ffffffffffffffff8111156110e457600080fd5b6020830191508360208260051b85010111156110ff57600080fd5b9250929050565b6000806000806060858703121561111c57600080fd5b843563ffffffff8116811461113057600080fd5b9350602085013560ff8116811461114657600080fd5b9250604085013567ffffffffffffffff81111561116257600080fd5b61116e878288016110ba565b95989497509550505050565b6000815180845260005b818110156111a057602081850181015186830182015201611184565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006111f1602083018461117a565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461121c57600080fd5b919050565b6000806040838503121561123457600080fd5b61123d836111f8565b946020939093013593505050565b60008060008060006060868803121561126357600080fd5b61126c866111f8565b9450602086013567ffffffffffffffff8082111561128957600080fd5b818801915088601f83011261129d57600080fd5b8135818111156112ac57600080fd5b8960208285010111156112be57600080fd5b6020830196508095505060408801359150808211156112dc57600080fd5b506112e9888289016110ba565b969995985093965092949392505050565b60006020828403121561130c57600080fd5b6111f1826111f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216029081169081811461136057611360611315565b5092915050565b60ff818116838216019081111561060857610608611315565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113e0576113e0611315565b5060010190565b8183823760009101908152919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261142c57600080fd5b83018035915067ffffffffffffffff82111561144757600080fd5b6020019150368190038213156110ff57600080fd5b60ff828116828216039081111561060857610608611315565b6000808585111561148557600080fd5b8386111561149257600080fd5b5050820193919092039150565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c6343000813000a", } var KeystoneForwarderABI = KeystoneForwarderMetaData.ABI @@ -171,9 +171,9 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transact(opts *bind.Tr return _KeystoneForwarder.Contract.contract.Transact(opts, method, params...) } -func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) { +func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { var out []interface{} - err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", workflowExecutionId) + err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", receiver, workflowExecutionId) if err != nil { return *new(common.Address), err @@ -185,12 +185,12 @@ func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.Cal } -func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) } -func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) } func (_KeystoneForwarder *KeystoneForwarderCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -249,16 +249,28 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AcceptOwnership() return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts) } -func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "report", targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "report", receiverAddress, rawReport, signatures) } -func (_KeystoneForwarder *KeystoneForwarderSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) } -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) +} + +func (_KeystoneForwarder *KeystoneForwarderTransactor) SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "setConfig", donId, f, signers) +} + +func (_KeystoneForwarder *KeystoneForwarderSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) +} + +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) } func (_KeystoneForwarder *KeystoneForwarderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -545,12 +557,160 @@ func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferred(l return event, nil } +type KeystoneForwarderReportProcessedIterator struct { + Event *KeystoneForwarderReportProcessed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *KeystoneForwarderReportProcessedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(KeystoneForwarderReportProcessed) + 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(KeystoneForwarderReportProcessed) + 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 *KeystoneForwarderReportProcessedIterator) Error() error { + return it.fail +} + +func (it *KeystoneForwarderReportProcessedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type KeystoneForwarderReportProcessed struct { + Receiver common.Address + WorkflowOwner common.Address + WorkflowExecutionId [32]byte + Result bool + Raw types.Log +} + +func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) { + + var receiverRule []interface{} + for _, receiverItem := range receiver { + receiverRule = append(receiverRule, receiverItem) + } + var workflowOwnerRule []interface{} + for _, workflowOwnerItem := range workflowOwner { + workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) + } + var workflowExecutionIdRule []interface{} + for _, workflowExecutionIdItem := range workflowExecutionId { + workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) + } + + logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) + if err != nil { + return nil, err + } + return &KeystoneForwarderReportProcessedIterator{contract: _KeystoneForwarder.contract, event: "ReportProcessed", logs: logs, sub: sub}, nil +} + +func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) { + + var receiverRule []interface{} + for _, receiverItem := range receiver { + receiverRule = append(receiverRule, receiverItem) + } + var workflowOwnerRule []interface{} + for _, workflowOwnerItem := range workflowOwner { + workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) + } + var workflowExecutionIdRule []interface{} + for _, workflowExecutionIdItem := range workflowExecutionId { + workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) + } + + logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(KeystoneForwarderReportProcessed) + if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) { + event := new(KeystoneForwarderReportProcessed) + if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + func (_KeystoneForwarder *KeystoneForwarder) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _KeystoneForwarder.abi.Events["OwnershipTransferRequested"].ID: return _KeystoneForwarder.ParseOwnershipTransferRequested(log) case _KeystoneForwarder.abi.Events["OwnershipTransferred"].ID: return _KeystoneForwarder.ParseOwnershipTransferred(log) + case _KeystoneForwarder.abi.Events["ReportProcessed"].ID: + return _KeystoneForwarder.ParseReportProcessed(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) @@ -565,12 +725,16 @@ func (KeystoneForwarderOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (KeystoneForwarderReportProcessed) Topic() common.Hash { + return common.HexToHash("0xdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c2081") +} + func (_KeystoneForwarder *KeystoneForwarder) Address() common.Address { return _KeystoneForwarder.address } type KeystoneForwarderInterface interface { - GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) + GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -578,7 +742,9 @@ type KeystoneForwarderInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) + Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) + + SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) @@ -594,6 +760,12 @@ type KeystoneForwarderInterface interface { ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error) + FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) + + WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) + + ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) + ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address From 03fcd08dfc810feb159ab50755f6928ded44c272 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 20:16:58 -0700 Subject: [PATCH 24/30] Replace optimismMode with chainFamily enum --- core/chains/evm/client/simulated_backend_client.go | 10 +++++----- core/chains/evm/logpoller/helper_test.go | 4 ++-- core/chains/evm/logpoller/log_poller_test.go | 4 ++-- core/chains/evm/types/types.go | 7 +++++++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go index 7ba2c045ce8..df3b709e6f7 100644 --- a/core/chains/evm/client/simulated_backend_client.go +++ b/core/chains/evm/client/simulated_backend_client.go @@ -70,7 +70,7 @@ type SimulatedBackendClient struct { client simulated.Client t testing.TB chainId *big.Int - optimismMode bool + chainFamily evmtypes.ChainFamily headByNumberCallback func(ctx context.Context, c *SimulatedBackendClient, n *big.Int) error } @@ -85,12 +85,12 @@ func NewSimulatedBackendClient(t testing.TB, b *simulated.Backend, chainId *big. } // Switch to a new backend client (simulating an rpc failover event) -// If optimismMode = true, the new backend will exhibit the non-geth behavior of optimism (and some other rpc clients), +// If chainFamily = Optimism, the new backend will exhibit the non-geth behavior of optimism (and some other rpc clients), // where success rather than an error code is returned when a call to FilterLogs() fails to find the block hash // requested. This combined with a failover event can lead to the "eventual consistency" behavior that Backup LogPoller // and other solutions were designed to recover from. -func (c *SimulatedBackendClient) SetBackend(backend evmtypes.Backend, optimismMode bool) { - c.optimismMode = optimismMode +func (c *SimulatedBackendClient) SetBackend(backend evmtypes.Backend, chainFamily evmtypes.ChainFamily) { + c.chainFamily = chainFamily c.b = backend c.client = backend.Client() } @@ -129,7 +129,7 @@ func (c *SimulatedBackendClient) CallContext(ctx context.Context, result interfa // FilterLogs returns all logs that respect the passed filter query. func (c *SimulatedBackendClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) (logs []types.Log, err error) { logs, err = c.client.FilterLogs(ctx, q) - if c.optimismMode { + if c.chainFamily == evmtypes.Optimism { if err != nil && err.Error() == "unknown block" { return []types.Log{}, nil // emulate optimism behavior of returning success instead of "unknown block" } diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index 1216bd1ad5f..4282dc56d24 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -118,7 +118,7 @@ func (th *TestHarness) assertHaveCanonical(t *testing.T, start, end int) { // Simulates an RPC failover event to an alternate rpc server. This can also be used to // simulate switching back to the primary rpc after it recovers. -func (th *TestHarness) SetActiveClient(backend evmtypes.Backend, optimismMode bool) { +func (th *TestHarness) SetActiveClient(backend evmtypes.Backend, chainFamily evmtypes.ChainFamily) { th.Backend = backend - th.Client.SetBackend(backend, optimismMode) + th.Client.SetBackend(backend, chainFamily) } diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index c9b4a1837d5..392968a8336 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -379,7 +379,7 @@ func Test_BackupLogPoller(t *testing.T) { if n.Int64() != 32 { return nil } - th.SetActiveClient(backupRpc, true) + th.SetActiveClient(backupRpc, evmtypes.Optimism) return nil }) @@ -395,7 +395,7 @@ func Test_BackupLogPoller(t *testing.T) { b, ok := primaryRpc.(*simulated.Backend) require.True(t, ok) - th.SetActiveClient(backendWrapper{b}, true) // restore primary rpc + th.SetActiveClient(backendWrapper{b}, evmtypes.Optimism) // restore primary rpc // Run ordinary poller + backup poller at least once require.NoError(t, err) diff --git a/core/chains/evm/types/types.go b/core/chains/evm/types/types.go index 94bb22e879e..cd6127b2ead 100644 --- a/core/chains/evm/types/types.go +++ b/core/chains/evm/types/types.go @@ -414,3 +414,10 @@ type Backend interface { AdjustTime(adjustment time.Duration) error Client() simulated.Client } + +type ChainFamily string + +const ( + Geth = ChainFamily(iota) + Optimism +) From 9afe36ea3c15dbdb71d22e2421de97127787ddab Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 20:27:09 -0700 Subject: [PATCH 25/30] Update more types GenesisAlloc, GenesisAccount, llo --- core/internal/features/features_test.go | 5 ++--- .../services/fluxmonitorv2/integrations_test.go | 3 +-- core/services/keeper/integration_test.go | 5 ++--- .../integration_tests/v1/internal/testutils.go | 3 +-- core/services/ocr2/plugins/llo/helpers_test.go | 1 + .../ocr2/plugins/llo/integration_test.go | 11 ++++++----- ...channel_definition_cache_integration_test.go | 8 ++++---- .../ocr2/plugins/mercury/integration_test.go | 3 +-- .../v21/logprovider/integration_test.go | 5 +++-- .../plugins/ocr2keeper/integration_21_test.go | 17 ++++++++--------- .../ocr2/plugins/ocr2keeper/integration_test.go | 9 ++++----- core/services/transmission/integration_test.go | 3 +-- core/services/vrf/proof/proof_response_test.go | 3 +-- .../vrf_hash_to_curve_cost_test.go | 3 +-- .../vrf_solidity_crosscheck_test.go | 4 ++-- .../vrf_v08_solidity_crosscheck_test.go | 4 ++-- .../services/vrf/v2/integration_v2_plus_test.go | 10 +++++----- core/services/vrf/vrftesthelpers/helpers.go | 6 +++--- 18 files changed, 48 insertions(+), 55 deletions(-) diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go index f8f2a173490..9c9d7aac8e6 100644 --- a/core/internal/features/features_test.go +++ b/core/internal/features/features_test.go @@ -19,7 +19,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/rpc" @@ -299,7 +298,7 @@ type OperatorContracts struct { func setupOperatorContracts(t *testing.T) OperatorContracts { user := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ user.From: {Balance: assets.Ether(1000).ToInt()}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) @@ -640,7 +639,7 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, co owner := testutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000000", 10) // 1000 eth - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ owner.From: {Balance: sb}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index 9c5b972c0e4..8536f549716 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -17,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/onsi/gomega" @@ -117,7 +116,7 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg f.neil = testutils.MustNewSimTransactor(t) f.ned = testutils.MustNewSimTransactor(t) f.nallory = oracleTransactor - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ f.sergey.From: {Balance: assets.Ether(1000).ToInt()}, f.neil.From: {Balance: assets.Ether(1000).ToInt()}, f.ned.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/keeper/integration_test.go b/core/services/keeper/integration_test.go index 6c026e1b29a..9a7e47144c8 100644 --- a/core/services/keeper/integration_test.go +++ b/core/services/keeper/integration_test.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/onsi/gomega" @@ -342,7 +341,7 @@ func TestKeeperForwarderEthIntegration(t *testing.T) { carrol := testutils.MustNewSimTransactor(t) // client nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, @@ -498,7 +497,7 @@ func TestMaxPerformDataSize(t *testing.T) { carrol := testutils.MustNewSimTransactor(t) // client nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index 29b4c76673d..a8e4dc52b35 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -17,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/hashicorp/consul/sdk/freeport" @@ -174,7 +173,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, owner.GasPrice = big.NewInt(int64(DefaultGasPrice)) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth - genesisData := core.GenesisAlloc{owner.From: {Balance: sb}} + genesisData := types.GenesisAlloc{owner.From: {Balance: sb}} gasLimit := ethconfig.Defaults.Miner.GasCeil * 2 // 60 M blocks b := backends.NewSimulatedBackend(genesisData, gasLimit) b.Commit() diff --git a/core/services/ocr2/plugins/llo/helpers_test.go b/core/services/ocr2/plugins/llo/helpers_test.go index 0f8686f3d93..c37a85b2dc9 100644 --- a/core/services/ocr2/plugins/llo/helpers_test.go +++ b/core/services/ocr2/plugins/llo/helpers_test.go @@ -15,6 +15,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/core/services/ocr2/plugins/llo/integration_test.go b/core/services/ocr2/plugins/llo/integration_test.go index 4fd28341602..7be9c94ded5 100644 --- a/core/services/ocr2/plugins/llo/integration_test.go +++ b/core/services/ocr2/plugins/llo/integration_test.go @@ -12,8 +12,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -47,18 +48,18 @@ var ( func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *channel_verifier.ChannelVerifier, common.Address, *channel_config_store.ChannelConfigStore, common.Address) { steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner - genesisData := core.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} + genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) backend.Commit() backend.Commit() // ensure starting block number at least 1 // Deploy contracts - verifierProxyAddr, _, _, err := verifier_proxy.DeployVerifierProxy(steve, backend, common.Address{}) // zero address for access controller disables access control + verifierProxyAddr, _, _, err := verifier_proxy.DeployVerifierProxy(steve, backend.Client(), common.Address{}) // zero address for access controller disables access control require.NoError(t, err) - verifierAddress, _, verifierContract, err := channel_verifier.DeployChannelVerifier(steve, backend, verifierProxyAddr) + verifierAddress, _, verifierContract, err := channel_verifier.DeployChannelVerifier(steve, backend.Client(), verifierProxyAddr) require.NoError(t, err) - configStoreAddress, _, configStoreContract, err := channel_config_store.DeployChannelConfigStore(steve, backend) + configStoreAddress, _, configStoreContract, err := channel_config_store.DeployChannelConfigStore(steve, backend.Client()) require.NoError(t, err) backend.Commit() diff --git a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go index ea8f64c02fa..a21a9dfc7d8 100644 --- a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go +++ b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go @@ -7,7 +7,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/assert" @@ -36,13 +36,13 @@ func Test_ChannelDefinitionCache_Integration(t *testing.T) { orm := llo.NewORM(db, testutils.SimulatedChainID) steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner - genesisData := core.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} + genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) backend.Commit() // ensure starting block number at least 1 ethClient := client.NewSimulatedBackendClient(t, backend, testutils.SimulatedChainID) - configStoreAddress, _, configStoreContract, err := channel_config_store.DeployChannelConfigStore(steve, backend) + configStoreAddress, _, configStoreContract, err := channel_config_store.DeployChannelConfigStore(steve, backend.Client()) require.NoError(t, err) channel1 := rand.Uint32() @@ -73,7 +73,7 @@ func Test_ChannelDefinitionCache_Integration(t *testing.T) { require.NoError(t, utils.JustError(configStoreContract.AddChannel(steve, channel2, channel2Def))) h := backend.Commit() - channel2Block, err := backend.BlockByHash(ctx, h) + channel2Block, err := backend.Client().BlockByHash(ctx, h) require.NoError(t, err) t.Run("with zero fromblock", func(t *testing.T) { diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go index 4b66ba8b308..9cc02c9e01f 100644 --- a/core/services/ocr2/plugins/mercury/integration_test.go +++ b/core/services/ocr2/plugins/mercury/integration_test.go @@ -19,7 +19,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" @@ -91,7 +90,7 @@ func detectPanicLogs(t *testing.T, logObservers []*observer.ObservedLogs) { func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *verifier.Verifier, common.Address) { steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner - genesisData := core.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} + genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) backend.Commit() // ensure starting block number at least 1 stopMining := cltest.Mine(backend, 1*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 147ab78c530..7c368e34323 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -6,11 +6,12 @@ import ( "testing" "time" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/jmoiron/sqlx" "github.com/stretchr/testify/require" @@ -525,7 +526,7 @@ func setupBackend(t *testing.T) (*simulated.Backend, func(), []*bind.TransactOpt sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000000000000000000).ToInt()}, steve.From: {Balance: assets.Ether(1000000000000000000).ToInt()}, carrol.From: {Balance: assets.Ether(1000000000000000000).ToInt()}, diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index 219d737c52d..5ee6731299f 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -17,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" @@ -94,7 +93,7 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) { sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, carrol.From: {Balance: assets.Ether(10000).ToInt()}, @@ -103,7 +102,7 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) @@ -195,7 +194,7 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, carrol.From: {Balance: assets.Ether(10000).ToInt()}, @@ -204,7 +203,7 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) @@ -303,7 +302,7 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, @@ -313,7 +312,7 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) @@ -438,7 +437,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { linkOwner := testutils.MustNewSimTransactor(t) // owns all the link registryOwner := testutils.MustNewSimTransactor(t) // registry owner upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()}, @@ -448,7 +447,7 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index 6cd30e6d215..70070653fca 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -13,7 +13,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" @@ -208,7 +207,7 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, @@ -217,7 +216,7 @@ func TestIntegration_KeeperPluginBasic(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) @@ -459,7 +458,7 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { sergey := testutils.MustNewSimTransactor(t) // owns all the link steve := testutils.MustNewSimTransactor(t) // registry owner carrol := testutils.MustNewSimTransactor(t) // upkeep owner - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, carrol.From: {Balance: assets.Ether(1000).ToInt()}, @@ -468,7 +467,7 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { 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()} + genesisData[nodeKeys[i].Address] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) diff --git a/core/services/transmission/integration_test.go b/core/services/transmission/integration_test.go index 805e6923ecb..418d8e26b67 100644 --- a/core/services/transmission/integration_test.go +++ b/core/services/transmission/integration_test.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" @@ -69,7 +68,7 @@ func deployTransmissionUniverse(t *testing.T) *EntryPointUniverse { holder1 = holder1Transactor holder2 = testutils.MustNewSimTransactor(t) ) - genesisData := core.GenesisAlloc{ + genesisData := types.GenesisAlloc{ holder1.From: {Balance: assets.Ether(1000).ToInt()}, holder2.From: {Balance: assets.Ether(1000).ToInt()}, } diff --git a/core/services/vrf/proof/proof_response_test.go b/core/services/vrf/proof/proof_response_test.go index 994ac80b5e2..73e20eca832 100644 --- a/core/services/vrf/proof/proof_response_test.go +++ b/core/services/vrf/proof/proof_response_test.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/pkg/errors" @@ -44,7 +43,7 @@ func TestMarshaledProof(t *testing.T) { ethereumKey, _ := crypto.GenerateKey() auth, err := bind.NewKeyedTransactorWithChainID(ethereumKey, big.NewInt(1337)) require.NoError(t, err) - genesisData := core.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend) diff --git a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go index 365614effda..38fd86bf11d 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go @@ -20,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -42,7 +41,7 @@ func deployVRFContract(t *testing.T) (contract, common.Address) { D: big.NewInt(1), } auth, _ := bind.NewKeyedTransactorWithChainID(&key, testutils.SimulatedChainID) - genesisData := core.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) parsed, err := abi.JSON(strings.NewReader( diff --git a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go index 2476ee04ce2..9ee29814e81 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go @@ -13,13 +13,13 @@ import ( "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.dedis.ch/kyber/v3" "github.com/smartcontractkit/chainlink-common/pkg/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/vrfkey" @@ -43,7 +43,7 @@ import ( // pure.) Revert to that, and see if it helps. func deployVRFTestHelper(t *testing.T) *solidity_vrf_verifier_wrapper.VRFTestHelper { auth := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend) diff --git a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go index 0552f93fea1..4366721cd0a 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go @@ -11,11 +11,11 @@ import ( "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/vrfkey" @@ -27,7 +27,7 @@ import ( // except we are testing against the v0.8 implementation of VRF.sol. func deployVRFV08TestHelper(t *testing.T) *solidity_vrf_v08_verifier_wrapper.VRFV08TestHelper { auth := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) _, _, verifier, err := solidity_vrf_v08_verifier_wrapper.DeployVRFV08TestHelper(auth, backend) diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go index 75030356cb7..7d9486c52a3 100644 --- a/core/services/vrf/v2/integration_v2_plus_test.go +++ b/core/services/vrf/v2/integration_v2_plus_test.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/onsi/gomega" "github.com/stretchr/testify/assert" @@ -85,7 +85,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer vrfConsumers = append(vrfConsumers, testutils.MustNewSimTransactor(t)) } - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, neil.From: {Balance: assets.Ether(1000).ToInt()}, ned.From: {Balance: assets.Ether(1000).ToInt()}, @@ -95,7 +95,7 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer submanager.From: {Balance: assets.Ether(1000).ToInt()}, } for _, consumer := range vrfConsumers { - genesisData[consumer.From] = core.GenesisAccount{ + genesisData[consumer.From] = gethtypes.Account{ Balance: assets.Ether(1000).ToInt(), } } @@ -695,7 +695,7 @@ func TestVRFV2PlusIntegration_ConsumerProxy_CoordinatorZeroAddress(t *testing.T) func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { owner := testutils.MustNewSimTransactor(t) random := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, random.From: {Balance: assets.Ether(10).ToInt()}, } @@ -773,7 +773,7 @@ func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { func TestVRFV2PlusIntegration_SimpleConsumerExample(t *testing.T) { owner := testutils.MustNewSimTransactor(t) random := testutils.MustNewSimTransactor(t) - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, } backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) diff --git a/core/services/vrf/vrftesthelpers/helpers.go b/core/services/vrf/vrftesthelpers/helpers.go index 2a534e675c1..182e714c537 100644 --- a/core/services/vrf/vrftesthelpers/helpers.go +++ b/core/services/vrf/vrftesthelpers/helpers.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/google/uuid" @@ -195,7 +195,7 @@ func NewVRFCoordinatorUniverse(t *testing.T, keys ...ethkey.KeyV2) CoordinatorUn ned = testutils.MustNewSimTransactor(t) carol = testutils.MustNewSimTransactor(t) ) - genesisData := core.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, neil.From: {Balance: assets.Ether(1000).ToInt()}, ned.From: {Balance: assets.Ether(1000).ToInt()}, @@ -203,7 +203,7 @@ func NewVRFCoordinatorUniverse(t *testing.T, keys ...ethkey.KeyV2) CoordinatorUn } for _, t := range oracleTransactors { - genesisData[t.From] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()} + genesisData[t.From] = gethtypes.Account{Balance: assets.Ether(1000).ToInt()} } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) From d78d54922321fd2b0305fa366050d36d7106cbdd Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 20:55:20 -0700 Subject: [PATCH 26/30] Fix some more compilation errors (fluxmonitor2, vrf, ocr2, functions) --- core/services/fluxmonitorv2/integrations_test.go | 3 ++- .../integration_tests/v1/internal/testutils.go | 10 ++++++---- core/services/ocr2/plugins/mercury/integration_test.go | 3 ++- .../evmregistry/v21/logprovider/integration_test.go | 2 +- core/services/vrf/proof/proof_response_test.go | 6 ++++-- .../vrf_hash_to_curve_cost_test.go | 7 +++++-- .../vrf_solidity_crosscheck_test.go | 6 ++++-- .../vrf_v08_solidity_crosscheck_test.go | 6 ++++-- 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index 8536f549716..ef134136a4c 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -17,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/onsi/gomega" @@ -116,7 +117,7 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg f.neil = testutils.MustNewSimTransactor(t) f.ned = testutils.MustNewSimTransactor(t) f.nallory = oracleTransactor - genesisData := types.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ f.sergey.From: {Balance: assets.Ether(1000).ToInt()}, f.neil.From: {Balance: assets.Ether(1000).ToInt()}, f.ned.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index a8e4dc52b35..f3bbb93458a 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -17,8 +17,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" "github.com/onsi/gomega" "github.com/stretchr/testify/require" @@ -256,7 +258,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, } } - CommitWithFinality(b) + CommitWithFinality(b.Backend) ticker := time.NewTicker(1 * time.Second) go func() { for range ticker.C { @@ -272,7 +274,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, Contract: proposalContract, Address: proposalAddress, } - return owner, b, ticker, active, proposed, clientContracts, routerAddress, routerContract, linkToken, allowListAddress, allowListContract + return owner, b.Backend, ticker, active, proposed, clientContracts, routerAddress, routerContract, linkToken, allowListAddress, allowListContract } func SetupRouterRoutes(t *testing.T, b *simulated.Backend, owner *bind.TransactOpts, routerContract *functions_router.FunctionsRouter, coordinatorAddress common.Address, proposedCoordinatorAddress common.Address, allowListAddress common.Address) { @@ -355,7 +357,7 @@ func StartNewNode( transmitter := sendingKeys[0].Address // fund the transmitter address - n, err := b.NonceAt(testutils.Context(t), owner.From, nil) + n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil) require.NoError(t, err) tx := cltest.NewLegacyTransaction( @@ -366,7 +368,7 @@ func StartNewNode( nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = b.SendTransaction(testutils.Context(t), signedTx) + err = b.Client().SendTransaction(testutils.Context(t), signedTx) require.NoError(t, err) b.Commit() diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go index 9cc02c9e01f..b35dd9e2f1e 100644 --- a/core/services/ocr2/plugins/mercury/integration_test.go +++ b/core/services/ocr2/plugins/mercury/integration_test.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/hashicorp/consul/sdk/freeport" @@ -90,7 +91,7 @@ func detectPanicLogs(t *testing.T, logObservers []*observer.ObservedLogs) { func setupBlockchain(t *testing.T) (*bind.TransactOpts, *simulated.Backend, *verifier.Verifier, common.Address) { steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner - genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} + genesisData := gethtypes.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil)) backend.Commit() // ensure starting block number at least 1 stopMining := cltest.Mine(backend, 1*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 7c368e34323..3e62143db94 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -460,7 +460,7 @@ func deployUpkeepCounter( ) { for i := 0; i < n; i++ { upkeepAddr, _, upkeepContract, err := log_upkeep_counter_wrapper.DeployLogUpkeepCounter( - account, backend, + account, backend.Client(), big.NewInt(100000), ) require.NoError(t, err) diff --git a/core/services/vrf/proof/proof_response_test.go b/core/services/vrf/proof/proof_response_test.go index 73e20eca832..32d4ad7e300 100644 --- a/core/services/vrf/proof/proof_response_test.go +++ b/core/services/vrf/proof/proof_response_test.go @@ -4,6 +4,8 @@ import ( "math/big" "testing" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_verifier_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" proof2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" @@ -43,10 +45,10 @@ func TestMarshaledProof(t *testing.T) { ethereumKey, _ := crypto.GenerateKey() auth, err := bind.NewKeyedTransactorWithChainID(ethereumKey, big.NewInt(1337)) require.NoError(t, err) - genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := gethtypes.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend) + _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend.Client()) if err != nil { panic(errors.Wrapf(err, "while initializing EVM contract wrapper")) } diff --git a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go index 38fd86bf11d..c2e703204c0 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_hash_to_curve_cost_test.go @@ -6,6 +6,9 @@ import ( "strings" "testing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_verifier_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -48,7 +51,7 @@ func deployVRFContract(t *testing.T) (contract, common.Address) { solidity_vrf_verifier_wrapper.VRFTestHelperABI)) require.NoError(t, err, "could not parse VRF ABI") address, _, vRFContract, err := bind.DeployContract(auth, parsed, - common.FromHex(solidity_vrf_verifier_wrapper.VRFTestHelperBin), backend) + common.FromHex(solidity_vrf_verifier_wrapper.VRFTestHelperBin), backend.Client()) require.NoError(t, err, "failed to deploy VRF contract to simulated blockchain") backend.Commit() return contract{vRFContract, address, &parsed, backend}, crypto.PubkeyToAddress( @@ -65,7 +68,7 @@ func estimateGas(t *testing.T, backend *simulated.Backend, require.NoError(t, err, "failed to construct raw %s transaction with args %s", method, args) callMsg := ethereum.CallMsg{From: from, To: &to, Data: rawData} - estimate, err := backend.EstimateGas(testutils.Context(t), callMsg) + estimate, err := backend.Client().EstimateGas(testutils.Context(t), callMsg) require.NoError(t, err, "failed to estimate gas from %s call with args %s", method, args) return estimate diff --git a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go index 9ee29814e81..c7c61cc3f39 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go @@ -7,6 +7,8 @@ import ( "strings" "testing" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_verifier_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" proof2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" @@ -43,10 +45,10 @@ import ( // pure.) Revert to that, and see if it helps. func deployVRFTestHelper(t *testing.T) *solidity_vrf_verifier_wrapper.VRFTestHelper { auth := testutils.MustNewSimTransactor(t) - genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := gethtypes.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend) + _, _, verifier, err := solidity_vrf_verifier_wrapper.DeployVRFTestHelper(auth, backend.Client()) require.NoError(t, err, "failed to deploy VRF contract to simulated blockchain") backend.Commit() return verifier diff --git a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go index 4366721cd0a..9842686b454 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go @@ -5,6 +5,8 @@ import ( mrand "math/rand" "testing" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_v08_verifier_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" proof2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" @@ -27,10 +29,10 @@ import ( // except we are testing against the v0.8 implementation of VRF.sol. func deployVRFV08TestHelper(t *testing.T) *solidity_vrf_v08_verifier_wrapper.VRFV08TestHelper { auth := testutils.MustNewSimTransactor(t) - genesisData := types.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} + genesisData := gethtypes.GenesisAlloc{auth.From: {Balance: assets.Ether(100).ToInt()}} gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil) backend := cltest.NewSimulatedBackend(t, genesisData, gasLimit) - _, _, verifier, err := solidity_vrf_v08_verifier_wrapper.DeployVRFV08TestHelper(auth, backend) + _, _, verifier, err := solidity_vrf_v08_verifier_wrapper.DeployVRFV08TestHelper(auth, backend.Client()) require.NoError(t, err, "failed to deploy VRF contract to simulated blockchain") backend.Commit() return verifier From 1a6e9ff0c020ead080811d8f3dd4be87a70f37c0 Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Tue, 28 May 2024 21:21:45 -0700 Subject: [PATCH 27/30] Fix lint errors, remove unused logpoller test definitions --- core/chains/evm/logpoller/log_poller_test.go | 46 +------------------ core/chains/evm/types/types.go | 2 +- core/internal/features/features_test.go | 5 +- .../v1/internal/testutils.go | 23 +++++----- .../v21/logprovider/integration_test.go | 1 + 5 files changed, 18 insertions(+), 59 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 392968a8336..6b9cb9d1e6e 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -223,49 +223,6 @@ func TestLogPoller_Integration(t *testing.T) { assert.ErrorIs(t, th.LogPoller.Replay(ctx, 4), logpoller.ErrReplayRequestAborted) } -type backendWrapper struct { - b *simulated.Backend -} - -func (b backendWrapper) Client() simulated.Client { - return b.b.Client() -} - -func (b backendWrapper) Close() error { - return b.b.Close() -} - -func (b backendWrapper) Commit() common.Hash { - return b.b.Commit() -} - -func (b backendWrapper) Rollback() { - b.b.Rollback() -} - -func (b backendWrapper) Fork(parentHash common.Hash) error { - return b.b.Fork(parentHash) -} - -func (b backendWrapper) AdjustTime(adjustment time.Duration) error { - return b.b.AdjustTime(adjustment) -} - -// Behaves as primary simulated.Client until failoverBlockNumber is requested (via HeaderByNumber), then -// fails over to secondary simulated.Client. -type failoverClient struct { - primary simulated.Client - secondary simulated.Client - failoverBlockNumber *big.Int -} - -func (f failoverClient) HeaderByNumber(ctx context.Context, n *big.Int) (*types.Header, error) { - if n.Cmp(f.failoverBlockNumber) < 0 { - return f.primary.HeaderByNumber(ctx, n) - } - return f.secondary.HeaderByNumber(ctx, n) -} - // Simulate an rpc failover event on optimism, where logs are requested from a block hash which doesn't // exist on the new rpc server, but a successful error code is returned. This is bad/buggy behavior on the // part of the rpc server, but we should be able to handle this without missing any logs, as @@ -395,7 +352,7 @@ func Test_BackupLogPoller(t *testing.T) { b, ok := primaryRpc.(*simulated.Backend) require.True(t, ok) - th.SetActiveClient(backendWrapper{b}, evmtypes.Optimism) // restore primary rpc + th.SetActiveClient(b, evmtypes.Optimism) // restore primary rpc // Run ordinary poller + backup poller at least once require.NoError(t, err) @@ -940,6 +897,7 @@ func TestLogPoller_PollAndSaveLogs(t *testing.T) { th.assertHaveCanonical(t, 1, 3) parent, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) + require.NoError(t, err) // Test scenario: reorg back to a chain that looks similar to the original chain. (simulated geth used to allow // re-org'ing back to exactly the same chain--now the best we can do is re-emit the same logs on a new one to simulate that) diff --git a/core/chains/evm/types/types.go b/core/chains/evm/types/types.go index cd6127b2ead..5c405b1cdc5 100644 --- a/core/chains/evm/types/types.go +++ b/core/chains/evm/types/types.go @@ -415,7 +415,7 @@ type Backend interface { Client() simulated.Client } -type ChainFamily string +type ChainFamily uint const ( Geth = ChainFamily(iota) diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go index 9c9d7aac8e6..3067f9a2300 100644 --- a/core/internal/features/features_test.go +++ b/core/internal/features/features_test.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/rpc" @@ -298,7 +299,7 @@ type OperatorContracts struct { func setupOperatorContracts(t *testing.T) OperatorContracts { user := testutils.MustNewSimTransactor(t) - genesisData := types.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ user.From: {Balance: assets.Ether(1000).ToInt()}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) @@ -639,7 +640,7 @@ func setupOCRContracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, co owner := testutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000000", 10) // 1000 eth - genesisData := types.GenesisAlloc{ + genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: sb}, } gasLimit := uint32(ethconfig.Defaults.Miner.GasCeil * 2) diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index f3bbb93458a..ddb3ca712ba 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -15,7 +15,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -177,19 +176,19 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth genesisData := types.GenesisAlloc{owner.From: {Balance: sb}} gasLimit := ethconfig.Defaults.Miner.GasCeil * 2 // 60 M blocks - b := backends.NewSimulatedBackend(genesisData, gasLimit) + b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(gasLimit)) b.Commit() // Deploy LINK token - linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(owner, b) + linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(owner, b.Client()) require.NoError(t, err) // Deploy mock LINK/ETH price feed - linkEthFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(owner, b, 18, big.NewInt(5_000_000_000_000_000)) + linkEthFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(owner, b.Client(), 18, big.NewInt(5_000_000_000_000_000)) require.NoError(t, err) // Deploy mock LINK/USD price feed - linkUsdFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(owner, b, 18, big.NewInt(1_500_00_000)) + linkUsdFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(owner, b.Client(), 18, big.NewInt(1_500_00_000)) require.NoError(t, err) // Deploy Router contract @@ -206,7 +205,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, SubscriptionDepositMinimumRequests: 10, SubscriptionDepositJuels: big.NewInt(9 * 1e18), // 9 LINK } - routerAddress, _, routerContract, err := functions_router.DeployFunctionsRouter(owner, b, linkAddr, functionsRouterConfig) + routerAddress, _, routerContract, err := functions_router.DeployFunctionsRouter(owner, b.Client(), linkAddr, functionsRouterConfig) require.NoError(t, err) // Deploy Allow List contract @@ -219,7 +218,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, } var initialAllowedSenders []common.Address var initialBlockedSenders []common.Address - allowListAddress, _, allowListContract, err := functions_allow_list.DeployTermsOfServiceAllowList(owner, b, allowListConfig, initialAllowedSenders, initialBlockedSenders) + allowListAddress, _, allowListContract, err := functions_allow_list.DeployTermsOfServiceAllowList(owner, b.Client(), allowListConfig, initialAllowedSenders, initialBlockedSenders) require.NoError(t, err) // Deploy Coordinator contract (matches updateConfig() in FunctionsBilling.sol) @@ -238,15 +237,15 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, FallbackUsdPerUnitLinkDecimals: uint8(8), } require.NoError(t, err) - coordinatorAddress, _, coordinatorContract, err := functions_coordinator.DeployFunctionsCoordinator(owner, b, routerAddress, coordinatorConfig, linkEthFeedAddr, linkUsdFeedAddr) + coordinatorAddress, _, coordinatorContract, err := functions_coordinator.DeployFunctionsCoordinator(owner, b.Client(), routerAddress, coordinatorConfig, linkEthFeedAddr, linkUsdFeedAddr) require.NoError(t, err) - proposalAddress, _, proposalContract, err := functions_coordinator.DeployFunctionsCoordinator(owner, b, routerAddress, coordinatorConfig, linkEthFeedAddr, linkUsdFeedAddr) + proposalAddress, _, proposalContract, err := functions_coordinator.DeployFunctionsCoordinator(owner, b.Client(), routerAddress, coordinatorConfig, linkEthFeedAddr, linkUsdFeedAddr) require.NoError(t, err) // Deploy Client contracts clientContracts := []deployedClientContract{} for i := 0; i < nClients; i++ { - clientContractAddress, _, clientContract, err := functions_client_example.DeployFunctionsClientExample(owner, b, routerAddress) + clientContractAddress, _, clientContract, err := functions_client_example.DeployFunctionsClientExample(owner, b.Client(), routerAddress) require.NoError(t, err) clientContracts = append(clientContracts, deployedClientContract{ Address: clientContractAddress, @@ -258,7 +257,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, } } - CommitWithFinality(b.Backend) + CommitWithFinality(b) ticker := time.NewTicker(1 * time.Second) go func() { for range ticker.C { @@ -274,7 +273,7 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, Contract: proposalContract, Address: proposalAddress, } - return owner, b.Backend, ticker, active, proposed, clientContracts, routerAddress, routerContract, linkToken, allowListAddress, allowListContract + return owner, b, ticker, active, proposed, clientContracts, routerAddress, routerContract, linkToken, allowListAddress, allowListContract } func SetupRouterRoutes(t *testing.T, b *simulated.Backend, owner *bind.TransactOpts, routerContract *functions_router.FunctionsRouter, coordinatorAddress common.Address, proposedCoordinatorAddress common.Address, allowListAddress common.Address) { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 3e62143db94..d71b62f9530 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -8,6 +8,7 @@ import ( gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/ethereum/go-ethereum/accounts/abi/bind" From 9f13b72d8f81d933a880be73de0183a716254a9a Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Wed, 29 May 2024 11:45:26 -0700 Subject: [PATCH 28/30] Run go-generate again on KeystoneForwarder --- .../keystone/generated/forwarder/forwarder.go | 204 ++---------------- 1 file changed, 16 insertions(+), 188 deletions(-) diff --git a/core/gethwrappers/keystone/generated/forwarder/forwarder.go b/core/gethwrappers/keystone/generated/forwarder/forwarder.go index fbdd024c64f..c66e2886793 100644 --- a/core/gethwrappers/keystone/generated/forwarder/forwarder.go +++ b/core/gethwrappers/keystone/generated/forwarder/forwarder.go @@ -31,8 +31,8 @@ var ( ) var KeystoneForwarderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"InvalidDonId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"}],\"name\":\"ReportAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"ReportProcessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61151d806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806379ba50971161005b57806379ba5097146101175780638da5cb5b1461011f578063c0965dc31461013d578063f2fde38b1461015057600080fd5b8063134a46f014610082578063181f5a7714610097578063390d0b15146100df575b600080fd5b610095610090366004611106565b610163565b005b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100d691906111de565b60405180910390f35b6100f26100ed366004611221565b61057d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61009561060e565b60005473ffffffffffffffffffffffffffffffffffffffff166100f2565b61009561014b36600461124b565b61070b565b61009561015e3660046112fa565b610ded565b60015474010000000000000000000000000000000000000000900460ff16156101b8576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560ff8316600003610234576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f81111561027e576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101829052601f60248201526044015b60405180910390fd5b610289836003611344565b60ff1681116102e7578061029e846003611344565b6102a9906001611367565b6040517f9dd9e6d8000000000000000000000000000000000000000000000000000000008152600481019290925260ff166024820152604401610275565b60005b63ffffffff85166000908152600260205260409020600101548110156103885763ffffffff8516600090815260026020526040812060010180548390811061033457610334611380565b600091825260208083209091015463ffffffff891683526002808352604080852073ffffffffffffffffffffffffffffffffffffffff9093168552910190915281205550610381816113af565b90506102ea565b5063ffffffff841660009081526002602052604090206103ac906001018383610ffe565b5060005b8181101561050a5760008383838181106103cc576103cc611380565b90506020020160208101906103e191906112fa565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290920190529020549091501561046c576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610477826001611367565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616808552868401835290842060ff959095169094559081526001938401805494850181558252902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055610503816113af565b90506103b0565b50505063ffffffff91909116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b6000806105df84846040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff169150505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461068f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610275565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60015474010000000000000000000000000000000000000000900460ff1615610760576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560588310156107da576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061081f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e0192505050565b63ffffffff8316600090815260026020526040812054949850929650909450925060ff9091169003610885576040517fea1b312900000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610275565b604080517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260039092529190205473ffffffffffffffffffffffffffffffffffffffff1615610939576040517f1aac3d2900000000000000000000000000000000000000000000000000000000815260048101829052602401610275565b63ffffffff8416600090815260026020526040902054869061095f9060ff166001611367565b60ff16146109ca5763ffffffff841660009081526002602052604090205461098b9060ff166001611367565b6040517fd6022e8e00000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101879052604401610275565b600089896040516109dc9291906113e7565b604051809103902090506109ee611086565b6000805b89811015610c5c576000806000610a608e8e86818110610a1457610a14611380565b9050602002810190610a2691906113f7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2692505050565b925092509250600060018883868660405160008152602001604052604051610aa4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610ac6573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015163ffffffff8f1660009081526002602081815284832073ffffffffffffffffffffffffffffffffffffffff851684529091019052918220549850925060ff881690039050610b81576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610b8c60018761145c565b955060008760ff8816601f8110610ba557610ba5611380565b602002015173ffffffffffffffffffffffffffffffffffffffff1614610c0f576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b80878760ff16601f8110610c2557610c25611380565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015250610c5592508391506113af9050565b90506109f2565b5050505060008a905060008173ffffffffffffffffffffffffffffffffffffffff1663ff5a027088868e8e6058908092610c9893929190611475565b6040518563ffffffff1660e01b8152600401610cb7949392919061149f565b600060405180830381600087803b158015610cd157600080fd5b505af1925050508015610ce2575060015b15610ceb575060015b604080518082018252338152821515602080830191825260008781526003909152839020915182549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91821617919091179091559051869186811691908f16907fdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c208190610daf90861515815260200190565b60405180910390a45050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905550505050505050505050565b610df5610e86565b610dfe81610f09565b50565b602081015160408201516044830151606490930151919360e09190911c929160601c90565b60008060006041845114610e6857836040517f2adfdc3000000000000000000000000000000000000000000000000000000000815260040161027591906111de565b50505060208101516040820151606090920151909260009190911a90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610275565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610275565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611076579160200282015b828111156110765781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061101e565b506110829291506110a5565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561108257600081556001016110a6565b60008083601f8401126110cc57600080fd5b50813567ffffffffffffffff8111156110e457600080fd5b6020830191508360208260051b85010111156110ff57600080fd5b9250929050565b6000806000806060858703121561111c57600080fd5b843563ffffffff8116811461113057600080fd5b9350602085013560ff8116811461114657600080fd5b9250604085013567ffffffffffffffff81111561116257600080fd5b61116e878288016110ba565b95989497509550505050565b6000815180845260005b818110156111a057602081850181015186830182015201611184565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006111f1602083018461117a565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461121c57600080fd5b919050565b6000806040838503121561123457600080fd5b61123d836111f8565b946020939093013593505050565b60008060008060006060868803121561126357600080fd5b61126c866111f8565b9450602086013567ffffffffffffffff8082111561128957600080fd5b818801915088601f83011261129d57600080fd5b8135818111156112ac57600080fd5b8960208285010111156112be57600080fd5b6020830196508095505060408801359150808211156112dc57600080fd5b506112e9888289016110ba565b969995985093965092949392505050565b60006020828403121561130c57600080fd5b6111f1826111f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216029081169081811461136057611360611315565b5092915050565b60ff818116838216019081111561060857610608611315565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113e0576113e0611315565b5060010190565b8183823760009101908152919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261142c57600080fd5b83018035915067ffffffffffffffff82111561144757600080fd5b6020019150368190038213156110ff57600080fd5b60ff828116828216039081111561060857610608611315565b6000808585111561148557600080fd5b8386111561149257600080fd5b5050820193919092039150565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b610c12806101576000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063c0965dc311610050578063c0965dc314610108578063e6b714581461012b578063f2fde38b1461016157600080fd5b8063181f5a771461007757806379ba5097146100bf5780638da5cb5b146100c9575b600080fd5b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100b69190610827565b60405180910390f35b6100c7610174565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b6565b61011b6101163660046108bc565b610276565b60405190151581526020016100b6565b6100e3610139366004610998565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6100c761016f3660046109b1565b61058e565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60025460009060ff16156102b6576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556044841161034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e6774680000000000000000000000000060448201526064016101f1565b600061035a85600481896109d3565b8101906103679190610a2c565b8051602082012090915060005b848110156104655760008060006103e289898681811061039657610396610afb565b90506020028101906103a89190610b2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a292505050565b925092509250600060018683868660405160008152602001604052604051610426949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610448573d6000803e3d6000fd5b5086955061045d9450859350610b9692505050565b915050610374565b5060008061047284610630565b600081815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff16156104ae57600094505050505061055d565b6000808b73ffffffffffffffffffffffffffffffffffffffff168b8b6040516104d8929190610bf5565b6000604051808303816000865af19150503d8060008114610515576040519150601f19603f3d011682016040523d82523d6000602084013e61051a565b606091505b5050506000928352505060036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001925050505b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905595945050505050565b6105966106af565b61059f81610732565b50565b60008060008351604114610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016101f1565b50505060208101516040820151606090920151909260009190911a90565b600080604083511161069e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207265706f7274206c656e677468000000000000000000000060448201526064016101f1565b505060208101516040909101519091565b60005473ffffffffffffffffffffffffffffffffffffffff163314610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016101f1565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016101f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208083528351808285015260005b8181101561085457858101830151858201604001528201610838565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b757600080fd5b919050565b6000806000806000606086880312156108d457600080fd5b6108dd86610893565b9450602086013567ffffffffffffffff808211156108fa57600080fd5b818801915088601f83011261090e57600080fd5b81358181111561091d57600080fd5b89602082850101111561092f57600080fd5b60208301965080955050604088013591508082111561094d57600080fd5b818801915088601f83011261096157600080fd5b81358181111561097057600080fd5b8960208260051b850101111561098557600080fd5b9699959850939650602001949392505050565b6000602082840312156109aa57600080fd5b5035919050565b6000602082840312156109c357600080fd5b6109cc82610893565b9392505050565b600080858511156109e357600080fd5b838611156109f057600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610a3e57600080fd5b813567ffffffffffffffff80821115610a5657600080fd5b818401915084601f830112610a6a57600080fd5b813581811115610a7c57610a7c6109fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ac257610ac26109fd565b81604052828152876020848701011115610adb57600080fd5b826020860160208301376000928101602001929092525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b5f57600080fd5b83018035915067ffffffffffffffff821115610b7a57600080fd5b602001915036819003821315610b8f57600080fd5b9250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818382376000910190815291905056fea164736f6c6343000813000a", } var KeystoneForwarderABI = KeystoneForwarderMetaData.ABI @@ -171,9 +171,9 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transact(opts *bind.Tr return _KeystoneForwarder.Contract.contract.Transact(opts, method, params...) } -func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { +func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) { var out []interface{} - err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", receiver, workflowExecutionId) + err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", workflowExecutionId) if err != nil { return *new(common.Address), err @@ -185,12 +185,12 @@ func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.Cal } -func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) } -func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) } func (_KeystoneForwarder *KeystoneForwarderCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -249,28 +249,16 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AcceptOwnership() return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts) } -func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "report", receiverAddress, rawReport, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "report", targetAddress, data, signatures) } -func (_KeystoneForwarder *KeystoneForwarderSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) +func (_KeystoneForwarder *KeystoneForwarderSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) } -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) -} - -func (_KeystoneForwarder *KeystoneForwarderTransactor) SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "setConfig", donId, f, signers) -} - -func (_KeystoneForwarder *KeystoneForwarderSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) -} - -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) } func (_KeystoneForwarder *KeystoneForwarderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -557,160 +545,12 @@ func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferred(l return event, nil } -type KeystoneForwarderReportProcessedIterator struct { - Event *KeystoneForwarderReportProcessed - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *KeystoneForwarderReportProcessedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(KeystoneForwarderReportProcessed) - 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(KeystoneForwarderReportProcessed) - 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 *KeystoneForwarderReportProcessedIterator) Error() error { - return it.fail -} - -func (it *KeystoneForwarderReportProcessedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type KeystoneForwarderReportProcessed struct { - Receiver common.Address - WorkflowOwner common.Address - WorkflowExecutionId [32]byte - Result bool - Raw types.Log -} - -func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) { - - var receiverRule []interface{} - for _, receiverItem := range receiver { - receiverRule = append(receiverRule, receiverItem) - } - var workflowOwnerRule []interface{} - for _, workflowOwnerItem := range workflowOwner { - workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) - } - var workflowExecutionIdRule []interface{} - for _, workflowExecutionIdItem := range workflowExecutionId { - workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) - } - - logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) - if err != nil { - return nil, err - } - return &KeystoneForwarderReportProcessedIterator{contract: _KeystoneForwarder.contract, event: "ReportProcessed", logs: logs, sub: sub}, nil -} - -func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) { - - var receiverRule []interface{} - for _, receiverItem := range receiver { - receiverRule = append(receiverRule, receiverItem) - } - var workflowOwnerRule []interface{} - for _, workflowOwnerItem := range workflowOwner { - workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) - } - var workflowExecutionIdRule []interface{} - for _, workflowExecutionIdItem := range workflowExecutionId { - workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) - } - - logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(KeystoneForwarderReportProcessed) - if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) { - event := new(KeystoneForwarderReportProcessed) - if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - func (_KeystoneForwarder *KeystoneForwarder) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _KeystoneForwarder.abi.Events["OwnershipTransferRequested"].ID: return _KeystoneForwarder.ParseOwnershipTransferRequested(log) case _KeystoneForwarder.abi.Events["OwnershipTransferred"].ID: return _KeystoneForwarder.ParseOwnershipTransferred(log) - case _KeystoneForwarder.abi.Events["ReportProcessed"].ID: - return _KeystoneForwarder.ParseReportProcessed(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) @@ -725,16 +565,12 @@ func (KeystoneForwarderOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } -func (KeystoneForwarderReportProcessed) Topic() common.Hash { - return common.HexToHash("0xdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c2081") -} - func (_KeystoneForwarder *KeystoneForwarder) Address() common.Address { return _KeystoneForwarder.address } type KeystoneForwarderInterface interface { - GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) + GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -742,9 +578,7 @@ type KeystoneForwarderInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) - - SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) + Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) @@ -760,12 +594,6 @@ type KeystoneForwarderInterface interface { ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error) - FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) - - WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) - - ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) - ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address From ca0909eebc3e447461e1b3aa69c48818515516dc Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Wed, 29 May 2024 12:49:25 -0700 Subject: [PATCH 29/30] Re-run "make generate" one more time, this time without any failures aside from the // error at the end that's in CI as well. --- .../keystone/generated/forwarder/forwarder.go | 204 ++++++++++++++++-- ...rapper-dependency-versions-do-not-edit.txt | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 12 +- 4 files changed, 196 insertions(+), 24 deletions(-) diff --git a/core/gethwrappers/keystone/generated/forwarder/forwarder.go b/core/gethwrappers/keystone/generated/forwarder/forwarder.go index c66e2886793..fbdd024c64f 100644 --- a/core/gethwrappers/keystone/generated/forwarder/forwarder.go +++ b/core/gethwrappers/keystone/generated/forwarder/forwarder.go @@ -31,8 +31,8 @@ var ( ) var KeystoneForwarderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b610c12806101576000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063c0965dc311610050578063c0965dc314610108578063e6b714581461012b578063f2fde38b1461016157600080fd5b8063181f5a771461007757806379ba5097146100bf5780638da5cb5b146100c9575b600080fd5b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100b69190610827565b60405180910390f35b6100c7610174565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b6565b61011b6101163660046108bc565b610276565b60405190151581526020016100b6565b6100e3610139366004610998565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6100c761016f3660046109b1565b61058e565b60015473ffffffffffffffffffffffffffffffffffffffff1633146101fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60025460009060ff16156102b6576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556044841161034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e6774680000000000000000000000000060448201526064016101f1565b600061035a85600481896109d3565b8101906103679190610a2c565b8051602082012090915060005b848110156104655760008060006103e289898681811061039657610396610afb565b90506020028101906103a89190610b2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a292505050565b925092509250600060018683868660405160008152602001604052604051610426949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610448573d6000803e3d6000fd5b5086955061045d9450859350610b9692505050565b915050610374565b5060008061047284610630565b600081815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff16156104ae57600094505050505061055d565b6000808b73ffffffffffffffffffffffffffffffffffffffff168b8b6040516104d8929190610bf5565b6000604051808303816000865af19150503d8060008114610515576040519150601f19603f3d011682016040523d82523d6000602084013e61051a565b606091505b5050506000928352505060036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055506001925050505b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905595945050505050565b6105966106af565b61059f81610732565b50565b60008060008351604114610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016101f1565b50505060208101516040820151606090920151909260009190911a90565b600080604083511161069e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207265706f7274206c656e677468000000000000000000000060448201526064016101f1565b505060208101516040909101519091565b60005473ffffffffffffffffffffffffffffffffffffffff163314610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016101f1565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016101f1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208083528351808285015260005b8181101561085457858101830151858201604001528201610838565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b757600080fd5b919050565b6000806000806000606086880312156108d457600080fd5b6108dd86610893565b9450602086013567ffffffffffffffff808211156108fa57600080fd5b818801915088601f83011261090e57600080fd5b81358181111561091d57600080fd5b89602082850101111561092f57600080fd5b60208301965080955050604088013591508082111561094d57600080fd5b818801915088601f83011261096157600080fd5b81358181111561097057600080fd5b8960208260051b850101111561098557600080fd5b9699959850939650602001949392505050565b6000602082840312156109aa57600080fd5b5035919050565b6000602082840312156109c357600080fd5b6109cc82610893565b9392505050565b600080858511156109e357600080fd5b838611156109f057600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610a3e57600080fd5b813567ffffffffffffffff80821115610a5657600080fd5b818401915084601f830112610a6a57600080fd5b813581811115610a7c57610a7c6109fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610ac257610ac26109fd565b81604052828152876020848701011115610adb57600080fd5b826020860160208301376000928101602001929092525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b5f57600080fd5b83018035915067ffffffffffffffff821115610b7a57600080fd5b602001915036819003821315610b8f57600080fd5b9250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818382376000910190815291905056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"InvalidDonId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"}],\"name\":\"ReportAlreadyProcessed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"ReportProcessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61151d806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806379ba50971161005b57806379ba5097146101175780638da5cb5b1461011f578063c0965dc31461013d578063f2fde38b1461015057600080fd5b8063134a46f014610082578063181f5a7714610097578063390d0b15146100df575b600080fd5b610095610090366004611106565b610163565b005b604080518082018252601781527f4b657973746f6e65466f7277617264657220312e302e30000000000000000000602082015290516100d691906111de565b60405180910390f35b6100f26100ed366004611221565b61057d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61009561060e565b60005473ffffffffffffffffffffffffffffffffffffffff166100f2565b61009561014b36600461124b565b61070b565b61009561015e3660046112fa565b610ded565b60015474010000000000000000000000000000000000000000900460ff16156101b8576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560ff8316600003610234576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f81111561027e576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101829052601f60248201526044015b60405180910390fd5b610289836003611344565b60ff1681116102e7578061029e846003611344565b6102a9906001611367565b6040517f9dd9e6d8000000000000000000000000000000000000000000000000000000008152600481019290925260ff166024820152604401610275565b60005b63ffffffff85166000908152600260205260409020600101548110156103885763ffffffff8516600090815260026020526040812060010180548390811061033457610334611380565b600091825260208083209091015463ffffffff891683526002808352604080852073ffffffffffffffffffffffffffffffffffffffff9093168552910190915281205550610381816113af565b90506102ea565b5063ffffffff841660009081526002602052604090206103ac906001018383610ffe565b5060005b8181101561050a5760008383838181106103cc576103cc611380565b90506020020160208101906103e191906112fa565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290920190529020549091501561046c576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610477826001611367565b63ffffffff8716600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616808552868401835290842060ff959095169094559081526001938401805494850181558252902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055610503816113af565b90506103b0565b50505063ffffffff91909116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b6000806105df84846040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff169150505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461068f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610275565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60015474010000000000000000000000000000000000000000900460ff1615610760576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560588310156107da576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061081f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e0192505050565b63ffffffff8316600090815260026020526040812054949850929650909450925060ff9091169003610885576040517fea1b312900000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610275565b604080517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208083019190915260348083018690528351808403909101815260549092018352815191810191909120600081815260039092529190205473ffffffffffffffffffffffffffffffffffffffff1615610939576040517f1aac3d2900000000000000000000000000000000000000000000000000000000815260048101829052602401610275565b63ffffffff8416600090815260026020526040902054869061095f9060ff166001611367565b60ff16146109ca5763ffffffff841660009081526002602052604090205461098b9060ff166001611367565b6040517fd6022e8e00000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101879052604401610275565b600089896040516109dc9291906113e7565b604051809103902090506109ee611086565b6000805b89811015610c5c576000806000610a608e8e86818110610a1457610a14611380565b9050602002810190610a2691906113f7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2692505050565b925092509250600060018883868660405160008152602001604052604051610aa4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610ac6573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015163ffffffff8f1660009081526002602081815284832073ffffffffffffffffffffffffffffffffffffffff851684529091019052918220549850925060ff881690039050610b81576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b610b8c60018761145c565b955060008760ff8816601f8110610ba557610ba5611380565b602002015173ffffffffffffffffffffffffffffffffffffffff1614610c0f576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610275565b80878760ff16601f8110610c2557610c25611380565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015250610c5592508391506113af9050565b90506109f2565b5050505060008a905060008173ffffffffffffffffffffffffffffffffffffffff1663ff5a027088868e8e6058908092610c9893929190611475565b6040518563ffffffff1660e01b8152600401610cb7949392919061149f565b600060405180830381600087803b158015610cd157600080fd5b505af1925050508015610ce2575060015b15610ceb575060015b604080518082018252338152821515602080830191825260008781526003909152839020915182549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff91821617919091179091559051869186811691908f16907fdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c208190610daf90861515815260200190565b60405180910390a45050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905550505050505050505050565b610df5610e86565b610dfe81610f09565b50565b602081015160408201516044830151606490930151919360e09190911c929160601c90565b60008060006041845114610e6857836040517f2adfdc3000000000000000000000000000000000000000000000000000000000815260040161027591906111de565b50505060208101516040820151606090920151909260009190911a90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610275565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610275565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611076579160200282015b828111156110765781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061101e565b506110829291506110a5565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561108257600081556001016110a6565b60008083601f8401126110cc57600080fd5b50813567ffffffffffffffff8111156110e457600080fd5b6020830191508360208260051b85010111156110ff57600080fd5b9250929050565b6000806000806060858703121561111c57600080fd5b843563ffffffff8116811461113057600080fd5b9350602085013560ff8116811461114657600080fd5b9250604085013567ffffffffffffffff81111561116257600080fd5b61116e878288016110ba565b95989497509550505050565b6000815180845260005b818110156111a057602081850181015186830182015201611184565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006111f1602083018461117a565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461121c57600080fd5b919050565b6000806040838503121561123457600080fd5b61123d836111f8565b946020939093013593505050565b60008060008060006060868803121561126357600080fd5b61126c866111f8565b9450602086013567ffffffffffffffff8082111561128957600080fd5b818801915088601f83011261129d57600080fd5b8135818111156112ac57600080fd5b8960208285010111156112be57600080fd5b6020830196508095505060408801359150808211156112dc57600080fd5b506112e9888289016110ba565b969995985093965092949392505050565b60006020828403121561130c57600080fd5b6111f1826111f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216029081169081811461136057611360611315565b5092915050565b60ff818116838216019081111561060857610608611315565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113e0576113e0611315565b5060010190565b8183823760009101908152919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261142c57600080fd5b83018035915067ffffffffffffffff82111561144757600080fd5b6020019150368190038213156110ff57600080fd5b60ff828116828216039081111561060857610608611315565b6000808585111561148557600080fd5b8386111561149257600080fd5b5050820193919092039150565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c6343000813000a", } var KeystoneForwarderABI = KeystoneForwarderMetaData.ABI @@ -171,9 +171,9 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transact(opts *bind.Tr return _KeystoneForwarder.Contract.contract.Transact(opts, method, params...) } -func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) { +func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { var out []interface{} - err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", workflowExecutionId) + err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", receiver, workflowExecutionId) if err != nil { return *new(common.Address), err @@ -185,12 +185,12 @@ func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.Cal } -func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) } -func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(workflowExecutionId [32]byte) (common.Address, error) { - return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, workflowExecutionId) +func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) { + return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId) } func (_KeystoneForwarder *KeystoneForwarderCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -249,16 +249,28 @@ func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AcceptOwnership() return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts) } -func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.contract.Transact(opts, "report", targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "report", receiverAddress, rawReport, signatures) } -func (_KeystoneForwarder *KeystoneForwarderSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) } -func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) { - return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, targetAddress, data, signatures) +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiverAddress, rawReport, signatures) +} + +func (_KeystoneForwarder *KeystoneForwarderTransactor) SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.contract.Transact(opts, "setConfig", donId, f, signers) +} + +func (_KeystoneForwarder *KeystoneForwarderSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) +} + +func (_KeystoneForwarder *KeystoneForwarderTransactorSession) SetConfig(donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) { + return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, f, signers) } func (_KeystoneForwarder *KeystoneForwarderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -545,12 +557,160 @@ func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferred(l return event, nil } +type KeystoneForwarderReportProcessedIterator struct { + Event *KeystoneForwarderReportProcessed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *KeystoneForwarderReportProcessedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(KeystoneForwarderReportProcessed) + 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(KeystoneForwarderReportProcessed) + 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 *KeystoneForwarderReportProcessedIterator) Error() error { + return it.fail +} + +func (it *KeystoneForwarderReportProcessedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type KeystoneForwarderReportProcessed struct { + Receiver common.Address + WorkflowOwner common.Address + WorkflowExecutionId [32]byte + Result bool + Raw types.Log +} + +func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) { + + var receiverRule []interface{} + for _, receiverItem := range receiver { + receiverRule = append(receiverRule, receiverItem) + } + var workflowOwnerRule []interface{} + for _, workflowOwnerItem := range workflowOwner { + workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) + } + var workflowExecutionIdRule []interface{} + for _, workflowExecutionIdItem := range workflowExecutionId { + workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) + } + + logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) + if err != nil { + return nil, err + } + return &KeystoneForwarderReportProcessedIterator{contract: _KeystoneForwarder.contract, event: "ReportProcessed", logs: logs, sub: sub}, nil +} + +func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) { + + var receiverRule []interface{} + for _, receiverItem := range receiver { + receiverRule = append(receiverRule, receiverItem) + } + var workflowOwnerRule []interface{} + for _, workflowOwnerItem := range workflowOwner { + workflowOwnerRule = append(workflowOwnerRule, workflowOwnerItem) + } + var workflowExecutionIdRule []interface{} + for _, workflowExecutionIdItem := range workflowExecutionId { + workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem) + } + + logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ReportProcessed", receiverRule, workflowOwnerRule, workflowExecutionIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(KeystoneForwarderReportProcessed) + if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) { + event := new(KeystoneForwarderReportProcessed) + if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + func (_KeystoneForwarder *KeystoneForwarder) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _KeystoneForwarder.abi.Events["OwnershipTransferRequested"].ID: return _KeystoneForwarder.ParseOwnershipTransferRequested(log) case _KeystoneForwarder.abi.Events["OwnershipTransferred"].ID: return _KeystoneForwarder.ParseOwnershipTransferred(log) + case _KeystoneForwarder.abi.Events["ReportProcessed"].ID: + return _KeystoneForwarder.ParseReportProcessed(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) @@ -565,12 +725,16 @@ func (KeystoneForwarderOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (KeystoneForwarderReportProcessed) Topic() common.Hash { + return common.HexToHash("0xdae8e752043eb5fc7e4a6eced57ceaf159548b630125ece9ffc41cfc952c2081") +} + func (_KeystoneForwarder *KeystoneForwarder) Address() common.Address { return _KeystoneForwarder.address } type KeystoneForwarderInterface interface { - GetTransmitter(opts *bind.CallOpts, workflowExecutionId [32]byte) (common.Address, error) + GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte) (common.Address, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -578,7 +742,9 @@ type KeystoneForwarderInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - Report(opts *bind.TransactOpts, targetAddress common.Address, data []byte, signatures [][]byte) (*types.Transaction, error) + Report(opts *bind.TransactOpts, receiverAddress common.Address, rawReport []byte, signatures [][]byte) (*types.Transaction, error) + + SetConfig(opts *bind.TransactOpts, donId uint32, f uint8, signers []common.Address) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) @@ -594,6 +760,12 @@ type KeystoneForwarderInterface interface { ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error) + FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (*KeystoneForwarderReportProcessedIterator, error) + + WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowOwner []common.Address, workflowExecutionId [][32]byte) (event.Subscription, error) + + ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) + ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address diff --git a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 8a3ad8cb2fd..103c137fdb9 100644 --- a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.14 -channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin 4ae3e6ca866fdf48850d67c0c7a4bdaf4905c81a4e3ce5efb9ef9613a55d8454 +channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin c90e29d9f1a885098982b6175e0447416431b28c605273c807694ac7141e9167 channel_config_verifier_proxy: ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.abi ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.bin 655658e5f61dfadfe3268de04f948b7e690ad03ca45676e645d6cd6018154661 channel_verifier: ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin e6020553bd8e3e6b250fcaffe7efd22aea955c8c1a0eb05d282fdeb0ab6550b7 errored_verifier: ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.bin a3e5a77262e13ee30fe8d35551b32a3452d71929e43fd780bbfefeaf4aa62e43 diff --git a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 1569801b3fb..a30823b737f 100644 --- a/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/operatorforwarder/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ -GETH_VERSION: 1.13.8 +GETH_VERSION: 1.13.14 authorized_forwarder: ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.abi ../../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.bin 8ea76c883d460f8353a45a493f2aebeb5a2d9a7b4619d1bc4fff5fb590bb3e10 authorized_receiver: ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.abi ../../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.bin 18e8969ba3234b027e1b16c11a783aca58d0ea5c2361010ec597f134b7bf1c4f link_token_receiver: ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.abi ../../../contracts/solc/v0.8.19/LinkTokenReceiver/LinkTokenReceiver.bin 839552e2bea179bdf2591805422fb33769c1646d5a014a00fc2c0cd9c03ef229 diff --git a/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt index f8709faff58..bc32be85110 100644 --- a/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,9 +1,9 @@ GETH_VERSION: 1.13.14 -entry_point: ../../../contracts/solc/v0.8.15/EntryPoint/EntryPoint.abi ../../../contracts/solc/v0.8.15/EntryPoint/EntryPoint.bin 2cb4bb2ba3efa8df3dfb0a57eb3727d17b68fe202682024fa7cfb4faf026833e +entry_point: ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.abi ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.bin e43da0e61256471b317cab1c87f2425cecba9b81ac21633334f889bab2f0777d greeter: ../../../contracts/solc/v0.8.15/Greeter.abi ../../../contracts/solc/v0.8.15/Greeter.bin 653dcba5c33a46292073939ce1e639372cf521c0ec2814d4c9f20c72f796f18c -greeter_wrapper: ../../../contracts/solc/v0.8.15/Greeter/Greeter.abi ../../../contracts/solc/v0.8.15/Greeter/Greeter.bin 653dcba5c33a46292073939ce1e639372cf521c0ec2814d4c9f20c72f796f18c -paymaster_wrapper: ../../../contracts/solc/v0.8.15/Paymaster/Paymaster.abi ../../../contracts/solc/v0.8.15/Paymaster/Paymaster.bin 189ef817a5b7a6ff53ddf35b1988465b8aec479c47b77236fe20bf7e67d48100 +greeter_wrapper: ../../../contracts/solc/v0.8.19/Greeter/Greeter.abi ../../../contracts/solc/v0.8.19/Greeter/Greeter.bin 7f6def58e337a53553a46cb7992cf2d75ec951014d79376fcb869a2b16b53f6d +paymaster_wrapper: ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.abi ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.bin dbdd1341cfa2d5c09730e0decc32339f62d1a4ea89835a51ff774226ddfbd04b sca: ../../../contracts/solc/v0.8.15/SCA.abi ../../../contracts/solc/v0.8.15/SCA.bin ae0f860cdac87d4ac505edbd228bd3ea1108550453aba67aebcb61f09cf70d0b -sca_wrapper: ../../../contracts/solc/v0.8.15/SCA/SCA.abi ../../../contracts/solc/v0.8.15/SCA/SCA.bin 2a8100fbdb41e6ce917ed333a624eaa4a8984b07e2d8d8ca6bba9bc9f74b05d7 -smart_contract_account_factory: ../../../contracts/solc/v0.8.15/SmartContractAccountFactory/SmartContractAccountFactory.abi ../../../contracts/solc/v0.8.15/SmartContractAccountFactory/SmartContractAccountFactory.bin a44d6fa2dbf9cb3441d6d637d89e1cd656f28b6bf4146f58d508067474bf845b -smart_contract_account_helper: ../../../contracts/solc/v0.8.15/SmartContractAccountHelper/SmartContractAccountHelper.abi ../../../contracts/solc/v0.8.15/SmartContractAccountHelper/SmartContractAccountHelper.bin 22f960a74bd1581a12aa4f8f438a3f265f32f43682f5c1897ca50707b9982d56 +sca_wrapper: ../../../contracts/solc/v0.8.19/SCA/SCA.abi ../../../contracts/solc/v0.8.19/SCA/SCA.bin 6ef817bdefad1b5e84f06e0bdc40848000ab00e1a38371435b793946f425a8e6 +smart_contract_account_factory: ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.abi ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.bin a357132e2782c462fa31ed80c270fe002e666a48ecfe407b71c278fc3a0d3679 +smart_contract_account_helper: ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.abi ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.bin a06aff23aded74d53bd342fdc32d80c3b474ff38223df27f3395e9fd90abd12a From a73f062ce92b916d3de47c78eefdcb1c572e7b6f Mon Sep 17 00:00:00 2001 From: Domino Valdano <2644901+reductionista@users.noreply.github.com> Date: Fri, 31 May 2024 14:09:32 -0700 Subject: [PATCH 30/30] Re-generate generation version db for keystone --- .../generated-wrapper-dependency-versions-do-not-edit.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt new file mode 100644 index 00000000000..7b21aec577a --- /dev/null +++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -0,0 +1,4 @@ +GETH_VERSION: 1.13.14 +forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin ed9164cfe4619dff824b11df46b66f4c6834b2ca072923f10d9ebc57ce508ed8 +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin d4e0661491c2adc7f0d7553287c938fb32664b9f07770f6d57ae6511ce9884cd +ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2