From 918bfc9adb1c417003a941901436a0933e010e25 Mon Sep 17 00:00:00 2001 From: george-dorin Date: Mon, 16 Dec 2024 19:51:24 +0200 Subject: [PATCH 1/3] wip --- .../dual-transmission/dual_aggregator.go | 5012 +++++++++++++++++ .../environment/nodeclient/chainlink.go | 29 +- .../actions/deployment_dual_aggregator.go | 54 + integration-tests/go.mod | 17 +- integration-tests/go.sum | 45 +- integration-tests/load/go.mod | 16 +- integration-tests/load/go.sum | 8 + .../smoke/config/dual_transmission_e2e.toml | 55 + .../ocr2_forwarders_dual_transmission_test.go | 230 + integration-tests/testconfig/testconfig.go | 31 +- 10 files changed, 5439 insertions(+), 58 deletions(-) create mode 100644 core/gethwrappers/dual-transmission/dual_aggregator.go create mode 100644 integration-tests/actions/deployment_dual_aggregator.go create mode 100644 integration-tests/smoke/config/dual_transmission_e2e.toml create mode 100644 integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go diff --git a/core/gethwrappers/dual-transmission/dual_aggregator.go b/core/gethwrappers/dual-transmission/dual_aggregator.go new file mode 100644 index 00000000000..65147a7a2d2 --- /dev/null +++ b/core/gethwrappers/dual-transmission/dual_aggregator.go @@ -0,0 +1,5012 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package gethwrappers + +import ( + "errors" + "math/big" + "strings" + + ethereum "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/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// DualAggregatorMetaData contains all meta data concerning the DualAggregator contract. +var DualAggregatorMetaData = &bind.MetaData{ + Bin: "0x61012060405234801562000011575f80fd5b50604051620062fa380380620062fa8339810160408190526200003491620005c0565b33805f816200008a5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b0384811691909117909155811615620000bc57620000bc81620001cd565b50506001805460ff60a01b1916600160a01b1790555060ff851661010052601789810b60805288900b60a0526001600160a01b0380841660c05263ffffffff821660e05260148054918c166001600160a01b0319909216821790556040515f907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a908290a36200014c8762000277565b6200015786620002f0565b620001635f806200036b565b6012805463ffffffff191663ffffffff84169081179091556040519081527fb24a681ce3399a408a89fd0c2b59dfc24bdad592b1c7ec7671cf060596c1c4d19060200160405180910390a16013620001bc85826200073b565b505050505050505050505062000807565b336001600160a01b03821603620002275760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000081565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6015546001600160a01b039081169082168114620002ec57601580546001600160a01b0319166001600160a01b0384811691821790925560408051928416835260208301919091527f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d4891291015b60405180910390a15b5050565b620002fa62000452565b6010546001600160a01b039081169082168114620002ec57601080546001600160a01b0319166001600160a01b0384811691821790925560408051928416835260208301919091527f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349101620002e3565b6200037562000452565b60408051808201909152600f546001600160a01b03808216808452600160a01b90920463ffffffff1660208401528416141580620003c357508163ffffffff16816020015163ffffffff1614155b156200044d576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052600f80546001600160c01b0319168417600160a01b830217905586518786015187519316835294820152909392909116917fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541910160405180910390a35b505050565b5f546001600160a01b03163314620004ad5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000081565b565b6001600160a01b0381168114620004c4575f80fd5b50565b8051601781900b8114620004d9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000502575f80fd5b81516001600160401b03808211156200051f576200051f620004de565b604051601f8301601f19908116603f011681019082821181831017156200054a576200054a620004de565b816040528381526020925086602085880101111562000567575f80fd5b5f91505b838210156200058a57858201830151818301840152908201906200056b565b5f602085830101528094505050505092915050565b8051620004d981620004af565b805163ffffffff81168114620004d9575f80fd5b5f805f805f805f805f806101408b8d031215620005db575f80fd5b8a51620005e881620004af565b9950620005f860208c01620004c7565b98506200060860408c01620004c7565b975060608b01516200061a81620004af565b60808c01519097506200062d81620004af565b60a08c015190965060ff8116811462000644575f80fd5b60c08c01519095506001600160401b0381111562000660575f80fd5b6200066e8d828e01620004f2565b9450506200067f60e08c016200059f565b9250620006906101008c01620005ac565b9150620006a16101208c01620005ac565b90509295989b9194979a5092959850565b600181811c90821680620006c757607f821691505b602082108103620006e657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200044d57805f5260205f20601f840160051c81016020851015620007135750805b601f840160051c820191505b8181101562000734575f81556001016200071f565b5050505050565b81516001600160401b03811115620007575762000757620004de565b6200076f81620007688454620006b2565b84620006ec565b602080601f831160018114620007a5575f84156200078d5750858301515b5f19600386901b1c1916600185901b178555620007ff565b5f85815260208120601f198616915b82811015620007d557888601518255948401946001909101908401620007b4565b5085821015620007f357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805160a05160c05160e05161010051615a92620008685f395f61046301525f8181613d5f0152613ff301525f61319e01525f8181610504015281816120bc01526145ea01525f81816103990152818161209401526145bf0152615a925ff3fe608060405234801561000f575f80fd5b506004361061031a575f3560e01c80639bd2c0b1116101a8578063c4c92b37116100f3578063e5fe45771161009e578063eb5dcd6c11610079578063eb5dcd6c146108b8578063f2fde38b146108cb578063fbffd2c1146108de578063feaf968c146108f1575f80fd5b8063e5fe45771461083d578063e76d516814610887578063eb457163146108a5575f80fd5b8063dc7f0124116100ce578063dc7f0124146107dd578063e3d0e71214610802578063e4902f8214610815575f80fd5b8063c4c92b3714610799578063d09dc339146107b7578063daffc4b5146107bf575f80fd5b8063b17f2a6b11610153578063b633620c1161012e578063b633620c14610760578063ba0cb29e14610773578063c107532914610786575f80fd5b8063b17f2a6b14610727578063b1dc65a41461073a578063b5ab58dc1461074d575f80fd5b8063a118f24911610183578063a118f249146106d1578063afcb95d7146106e4578063b121e14714610714575f80fd5b80639bd2c0b11461064c5780639c849b30146106ab5780639e3ceeab146106be575f80fd5b80636b14daf8116102685780638205bf6a116102135780638da5cb5b116101ee5780638da5cb5b146105a157806398e5b12a146105df5780639a6fc8f514610602575f80fd5b80638205bf6a146105735780638823da6c1461057b5780638ac28d5a1461058e575f80fd5b806379ba50971161024357806379ba5097146105335780638038e4a11461053b57806381ff704814610543575f80fd5b80636b14daf8146104df57806370da2f67146105025780637284e4161461052b575f80fd5b80634fb17470116102c8578063643dc105116102a3578063643dc105146104af578063666cab8d146104c2578063668a0f02146104d7575f80fd5b80634fb174701461048d57806350d25bcd146104a057806354fd4d50146104a8575f80fd5b806322adbc78116102f857806322adbc781461039757806329937268146103c0578063313ce5671461045c575f80fd5b80630a7569831461031e5780630eafb25b14610328578063181f5a771461034e575b5f80fd5b6103266108f9565b005b61033b610336366004614e46565b610977565b6040519081526020015b60405180910390f35b61038a6040518060400160405280601481526020017f4475616c41676772656761746f7220312e302e3000000000000000000000000081525081565b6040516103459190614ec2565b7f000000000000000000000000000000000000000000000000000000000000000060170b61033b565b600d54600c546040805163ffffffff6e010000000000000000000000000000850481168252720100000000000000000000000000000000000085048116602083015276010000000000000000000000000000000000000000000085048116928201929092527a01000000000000000000000000000000000000000000000000000090930416606083015262ffffff16608082015260a001610345565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610345565b61032661049b366004614ed4565b610aa6565b61033b610d43565b600661033b565b6103266104bd366004614f1c565b610d6d565b6104ca611001565b6040516103459190614fe0565b61033b61106e565b6104f26104ed3660046150f8565b611082565b6040519015158152602001610345565b7f000000000000000000000000000000000000000000000000000000000000000060170b61033b565b61038a6110b6565b61032661113d565b61032661123e565b600e54600b546040805163ffffffff80851682526401000000009094049093166020840152820152606001610345565b61033b6112d1565b610326610589366004614e46565b61131b565b61032661059c366004614e46565b6113d3565b5f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610345565b6105e761143b565b60405169ffffffffffffffffffff9091168152602001610345565b610615610610366004615145565b6115b7565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610345565b604080518082018252600f5473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910463ffffffff16602092830181905283519182529181019190915201610345565b6103266106b93660046151b6565b61167b565b6103266106cc366004614e46565b611896565b6103266106df366004614e46565b611947565b600b54600d54604080515f8152602081019390935261010090910460081c63ffffffff1690820152606001610345565b610326610722366004614e46565b6119f9565b61032661073536600461521d565b611aef565b610326610748366004615238565b611b5a565b61033b61075b366004615311565b611b75565b61033b61076e366004615311565b611bad565b610326610781366004615238565b611c05565b610326610794366004615328565b611c17565b60155473ffffffffffffffffffffffffffffffffffffffff166105ba565b61033b611ee4565b60105473ffffffffffffffffffffffffffffffffffffffff166105ba565b6001546104f29074010000000000000000000000000000000000000000900460ff1681565b610326610810366004615416565b611f96565b610828610823366004614e46565b6127bc565b60405163ffffffff9091168152602001610345565b610845612885565b6040805195865263ffffffff909416602086015260ff9092169284019290925260179190910b606083015267ffffffffffffffff16608082015260a001610345565b60145473ffffffffffffffffffffffffffffffffffffffff166105ba565b6103266108b33660046154db565b612932565b6103266108c6366004614ed4565b612a69565b6103266108d9366004614e46565b612bbe565b6103266108ec366004614e46565b612bcf565b610615612be0565b610901612c78565b60015474010000000000000000000000000000000000000000900460ff161561097557600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f539638905f90a15b565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602090815260408083208151606081018352905460ff80821615158084526101008304909116948301949094526201000090046bffffffffffffffffffffffff1691810191909152906109e957505f92915050565b600d5460208201515f91760100000000000000000000000000000000000000000000900463ffffffff169060079060ff16601f8110610a2a57610a2a615507565b600881049190910154600d54610a60926007166004026101000a90910463ffffffff908116916601000000000000900416615561565b63ffffffff16610a70919061557e565b610a7e90633b9aca0061557e565b905081604001516bffffffffffffffffffffffff1681610a9e9190615595565b949350505050565b610aae612c78565b60145473ffffffffffffffffffffffffffffffffffffffff908116908316819003610ad857505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610b40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6491906155a8565b50610b6d612cf8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610bd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb91906155a8565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192509083169063a9059cbb906044016020604051808303815f875af1158015610c71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9591906155bf565b610ccb576040517f7725087a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925560405190918416907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a905f90a350505b5050565b5f60115f610d4f613138565b63ffffffff16815260208101919091526040015f205460170b919050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331480610e2657506015546040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636b14daf890610de79033905f9036906004016155de565b602060405180830381865afa158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2691906155bf565b610e5c576040517f91ed77c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e64612cf8565b600d80547fffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff166e01000000000000000000000000000063ffffffff8881169182027fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff16929092177201000000000000000000000000000000000000888416908102919091177fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000008885169081027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16919091177a01000000000000000000000000000000000000000000000000000094881694850217909455600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001662ffffff871690811790915560408051938452602084019290925290820193909352606081019190915260808101919091527f0bf184bf1bba9699114bdceddaf338a1b364252c5e497cc01918dde92031713f9060a00160405180910390a15050505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561106457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611039575b5050505050905090565b5f611077613138565b63ffffffff16905090565b5f61108d838361329d565b806110ad575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b6060601380546110c590615647565b80601f01602080910402602001604051908101604052809291908181526020018280546110f190615647565b80156110645780601f1061111357610100808354040283529160200191611064565b820191905f5260205f20905b81548152906001019060200180831161111f57509395945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611246612c78565b60015474010000000000000000000000000000000000000000900460ff1661097557600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c3480905f90a1565b5f60115f6112dd613138565b63ffffffff908116825260208201929092526040015f20547c0100000000000000000000000000000000000000000000000000000000900416919050565b611323612c78565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602052604090205460ff16156113d05773ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d191015b60405180910390a15b50565b73ffffffffffffffffffffffffffffffffffffffff8181165f90815260166020526040902054163314611432576040517f2ab4a3db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d0816132f1565b5f805473ffffffffffffffffffffffffffffffffffffffff1633148015906114f957506010546040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636b14daf8906114b89033905f9036906004016155de565b602060405180830381865afa1580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f791906155bf565b155b15611530576040517f4cdc445800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54600b546040805191825263ffffffff6101008404600881901c8216602085015260ff811684840152915164ffffffffff9092169366010000000000009004169133917f41e3990591fd372502daa15842da15bc7f41c75309ab3ff4f56f1848c178825c9181900360600190a26115aa816001615692565b63ffffffff169250505090565b5f805f805f6115c4613138565b63ffffffff168669ffffffffffffffffffff1611156115f057505f935083925082915081905080611672565b5050505063ffffffff8281165f9081526011602090815260409182902082516060810184529054601781900b8083527801000000000000000000000000000000000000000000000000820486169383018490527c0100000000000000000000000000000000000000000000000000000000909104909416920182905284935090835b91939590929450565b611683612c78565b8281146116bc576040517f3d2f942900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561188f575f8585838181106116d9576116d9615507565b90506020020160208101906116ee9190614e46565b90505f84848481811061170357611703615507565b90506020020160208101906117189190614e46565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526016602052604090205491925016801580158161177d57508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156117b4576040517faeae062800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8481165f90815260166020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001685831690811790915590831614611880578273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b505050508060010190506116be565b5050505050565b61189e612c78565b60105473ffffffffffffffffffffffffffffffffffffffff9081169082168114610d3f57601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821790925560408051928416835260208301919091527f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae63491015b60405180910390a15050565b61194f612c78565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602052604090205460ff166113d05773ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db491016113c7565b73ffffffffffffffffffffffffffffffffffffffff8181165f90815260176020526040902054163314611a58576040517f6599cbbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8181165f8181526016602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556017909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b611af7612c78565b601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83169081179091556040519081527fb24a681ce3399a408a89fd0c2b59dfc24bdad592b1c7ec7671cf060596c1c4d1906020016113c7565b611b6b88888888888888885f613546565b5050505050505050565b5f611b7e613138565b63ffffffff16821115611b9257505f919050565b5063ffffffff165f9081526011602052604090205460170b90565b5f611bb6613138565b63ffffffff16821115611bca57505f919050565b5063ffffffff9081165f908152601160205260409020547c010000000000000000000000000000000000000000000000000000000090041690565b611b6b88888888888888886001613546565b5f5473ffffffffffffffffffffffffffffffffffffffff163314801590611cd457506015546040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636b14daf890611c939033905f9036906004016155de565b602060405180830381865afa158015611cae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd291906155bf565b155b15611d0b576040517f91ed77c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611d146138c3565b6014546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192505f9173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611d85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da991906155a8565b905081811015611de5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60145473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85611e17611e1186866156af565b87613aa6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015611e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea891906155bf565b611ede576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6014546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f91829173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7891906155a8565b90505f611f836138c3565b9050611f8f81836156c2565b9250505090565b611f9e612c78565b601f86511115611fda576040517f25d0209c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451865114612015576040517f250a65b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85516120228560036156e1565b60ff161061205c576040517f20c9729a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120688460ff16613abc565b604080517f010000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000821b60218201527f000000000000000000000000000000000000000000000000000000000000000090911b60398201526051016040516020818303038152906040528051906020012083805190602001201461213b576040517fa8811dc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160c08101825267ffffffffffffffff8416815260ff86166020820152908101849052606081018290526080810187905260a08101869052600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff1690556121a6612cf8565b6005545f5b81811015612291575f600582815481106121c7576121c7615507565b5f9182526020822001546006805473ffffffffffffffffffffffffffffffffffffffff9092169350908490811061220057612200615507565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff948516835260048252604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905594168252600390529190912080547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169055506001016121ab565b5061229d60055f614cdc565b6122a860065f614cdc565b5f5b8260800151518110156125b55760045f846080015183815181106122d0576122d0615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f205460ff161561233a576040517f16c6131500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806001151581526020018260ff1681525060045f8560800151848151811061236e5761236e615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040015f90812083518154949093015160ff16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff931515939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093179190911790915560a0840151805160039291908490811061242357612423615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f205460ff161561248d576040517fd63d347400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180606001604052806001151581526020018260ff1681526020015f6bffffffffffffffffffffffff1681525060035f8560a0015184815181106124d5576124d5615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260409081015f20835181549385015194909201516bffffffffffffffffffffffff1662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff931515939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169390931791909117929092161790556001016122aa565b50608082015180516125cf91600591602090910190614cf7565b5060a082015180516125e991600691602090910190614cf7565b506020820151600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055600e80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff811664010000000063ffffffff4381168202928317855590830481169360019390925f9261267a928692908216911617615692565b92506101000a81548163ffffffff021916908363ffffffff1602179055506126d74630600e5f9054906101000a900463ffffffff1663ffffffff1686608001518760a00151886020015189604001518a5f01518b60600151613af5565b600b819055600e54608085015160a08601516020870151604080890151895160608b015192517f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e059861273d988b98919763ffffffff9091169691959094919391926156fd565b60405180910390a1600d546601000000000000900463ffffffff165f5b8460800151518110156127af5781600782601f811061277b5761277b615507565b600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555080600101905061275a565b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602090815260408083208151606081018352905460ff80821615158084526101008304909116948301949094526201000090046bffffffffffffffffffffffff16918101919091529061282e57505f92915050565b6007816020015160ff16601f811061284857612848615507565b600881049190910154600d5461287e926007166004026101000a90910463ffffffff908116916601000000000000900416615561565b9392505050565b5f808080803332146128c3576040517f74e2cd5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600b54600d5463ffffffff6601000000000000820481165f908152601160205260409020549296610100909204600881901c8216965064ffffffffff169450601783900b93507c010000000000000000000000000000000000000000000000000000000090920490911690565b61293a612c78565b60408051808201909152600f5473ffffffffffffffffffffffffffffffffffffffff8082168084527401000000000000000000000000000000000000000090920463ffffffff16602084015284161415806129a557508163ffffffff16816020015163ffffffff1614155b15612a645760408051808201825273ffffffffffffffffffffffffffffffffffffffff85811680835263ffffffff8681166020948501819052600f80547fffffffffffffffff00000000000000000000000000000000000000000000000016841774010000000000000000000000000000000000000000830217905586518786015187519316835294820152909392909116917fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541910160405180910390a35b505050565b73ffffffffffffffffffffffffffffffffffffffff8281165f90815260166020526040902054163314612ac8576040517fb97d016a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81163303612b17576040517f79df0c6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8083165f90815260176020526040902080548383167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117909255909116908114612a645760405173ffffffffffffffffffffffffffffffffffffffff8084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e38367905f90a4505050565b612bc6612c78565b6113d081613ba0565b612bd7612c78565b6113d081613c94565b5f805f805f80612bee613138565b63ffffffff9081165f8181526011602090815260409182902082516060810184529054601781900b8083527801000000000000000000000000000000000000000000000000820487169383018490527c0100000000000000000000000000000000000000000000000000000000909104909516920182905291999298509096509450879350915050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016111ba565b601454600d54604080516103e081019182905273ffffffffffffffffffffffffffffffffffffffff90931692660100000000000090920463ffffffff16915f91600790601f908285855b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411612d42579050505050505090505f6006805480602002602001604051908101604052809291908181526020018280548015612de757602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612dbc575b505050505090505f5b815181101561312a575f60035f848481518110612e0f57612e0f615507565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1690505f60035f858581518110612e9157612e91615507565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505f8483601f8110612f1557612f15615507565b6020020151600d5490870363ffffffff9081169250760100000000000000000000000000000000000000000000909104168102633b9aca00028201801561311f575f60165f878781518110612f6c57612f6c615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081015f205490517fa9059cbb00000000000000000000000000000000000000000000000000000000815290821660048201819052602482018590529250908a169063a9059cbb906044016020604051808303815f875af1158015613002573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061302691906155bf565b61305c576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878786601f811061306f5761306f615507565b602002019063ffffffff16908163ffffffff16815250508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168787815181106130c6576130c6615507565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c8560405161311591815260200190565b60405180910390a4505b505050600101612df0565b5061188f600783601f614d7f565b600d545f9063ffffffff660100000000000082048116916a010000000000000000000081049091169060ff7e010000000000000000000000000000000000000000000000000000000000009091041673ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036132305760125463ffffffff8381165f90815260116020526040902054429261320d92908116917c0100000000000000000000000000000000000000000000000000000000900416615692565b63ffffffff16101561322957613221613d35565b935050505090565b5092915050565b8163ffffffff168363ffffffff160361329557808015613285575063ffffffff8084165f908152601160205260409020547c010000000000000000000000000000000000000000000000000000000090041642145b1561329557613221600184615561565b509092915050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526002602052604081205460ff16806110ad57505060015474010000000000000000000000000000000000000000900460ff161592915050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360209081526040918290208251606081018452905460ff80821615158084526101008304909116938301939093526201000090046bffffffffffffffffffffffff169281019290925261335f575050565b5f61336983610977565b90508015612a645773ffffffffffffffffffffffffffffffffffffffff8381165f90815260166020526040908190205460145491517fa9059cbb000000000000000000000000000000000000000000000000000000008152908316600482018190526024820185905292919091169063a9059cbb906044016020604051808303815f875af11580156133fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061342191906155bf565b613457576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5f0160069054906101000a900463ffffffff166007846020015160ff16601f811061348657613486615507565b6008810491909101805460079092166004026101000a63ffffffff81810219909316939092169190910291909117905573ffffffffffffffffffffffffffffffffffffffff8481165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff169055601454915186815291841693851692917fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c910160405180910390a450505050565b5f5a90506135568a898887613e1d565b5f6135958a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613f3192505050565b6040805161012081018252600d5460ff808216835261010080830464ffffffffff1660208501526601000000000000830463ffffffff908116958501959095526a01000000000000000000008304851660608501526e01000000000000000000000000000083048516608085015272010000000000000000000000000000000000008304851660a08501527601000000000000000000000000000000000000000000008304851660c08501527a010000000000000000000000000000000000000000000000000000830490941660e08401527e01000000000000000000000000000000000000000000000000000000000000909104161515918101919091529091508315613781575f806136a884613fc7565b91509150811561377e578063ffffffff16836060015163ffffffff16106136fb576040517ff803a2ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff166a010000000000000000000063ffffffff8416908102919091179091556040517f8d530b9ddc4b318d28fdd4c3a21fcfecece54c1a72a824f262985b99afef009b905f90a261377483855f015187614170565b50505050506138b8565b50505b602081810151908d01359064ffffffffff80831691161415806137a75750816101000151155b1561381a57816020015164ffffffffff168164ffffffffff16116137f7576040517ff803a2ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138078d8d8d8d8d8d8d8d6142ab565b613815828e358386896144f8565b613858565b600d54604051660100000000000090910463ffffffff16907fda2435684a37fba6f7841e49b59e6ad975e462bbebd28ec9da4ed9746a6992be905f90a25b600d80547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000008715150217905582516138b390839086614170565b505050505b505050505050505050565b5f80600680548060200260200160405190810160405280929190818152602001828054801561392657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116138fb575b50508351600d54604080516103e08101918290529697509195660100000000000090910463ffffffff1694505f93509150600790601f908285855b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411613961579050505050505090505f5b838110156139e9578181601f81106139c0576139c0615507565b60200201516139cf9084615561565b6139df9063ffffffff1687615595565b95506001016139a6565b50600d54613a1b90760100000000000000000000000000000000000000000000900463ffffffff16633b9aca0061557e565b613a25908661557e565b94505f5b83811015613a9e5760035f868381518110613a4657613a46615507565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2054613a94906201000090046bffffffffffffffffffffffff1687615595565b9550600101613a29565b505050505090565b5f81831015613ab65750816110b0565b50919050565b5f81116113d0576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808a8a8a8a8a8a8a8a8a604051602001613b1899989796959493929190615792565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150505b9998505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613c1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016111ba565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60155473ffffffffffffffffffffffffffffffffffffffff9081169082168114610d3f57601580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821790925560408051928416835260208301919091527f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d48912910161193b565b600d545f906601000000000000900463ffffffff16805b63ffffffff811615613dff5763ffffffff7f000000000000000000000000000000000000000000000000000000000000000016613d898284615561565b63ffffffff1614613dff5760125463ffffffff8281165f908152601160205260409020544292613ddd92908116917c0100000000000000000000000000000000000000000000000000000000900416615692565b63ffffffff161015613def5792915050565b613df881615826565b9050613d4c565b5050600d546a0100000000000000000000900463ffffffff16919050565b335f9081526003602052604090205460ff16613e65576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b54843514613ea1576040517fdfdcf8e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613eac8383836149eb565b600d54613ebd9060ff166001615863565b60ff168214613ef8576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214611ede576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516080810182525f80825260208201526060918101829052818101919091525f805f8085806020019051810190613f6b919061588d565b9350935093509350613f7d8683614a67565b815160408051602081018690525f910160408051918152928152825160808101845260179490940b845263ffffffff90961660208401525081019390935260608301525092915050565b600d545f9081906601000000000000900463ffffffff16805b63ffffffff8116156141645763ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661401d8284615561565b63ffffffff160361405a576040517fc3d2e25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8082165f9081526011602090815260409182902082516060810184529054601781900b82527801000000000000000000000000000000000000000000000000810485168284018190527c01000000000000000000000000000000000000000000000000000000009091048516938201939093529088015190921611156140ec57505f958695509350505050565b856020015163ffffffff16816020015163ffffffff1614801561414157506060860151805161411d90600290615950565b8151811061412d5761412d615507565b602002602001015160170b815f015160170b145b15614153575060019590945092505050565b5061415d81615826565b9050613fe0565b505f9485945092505050565b5f8260170b121561418057505050565b5f6141a6633b9aca003a048560a0015163ffffffff16866080015163ffffffff16614ac7565b9050601036025f5a600c549091505f906141d19063ffffffff8716908690869062ffffff1686614aec565b90505f670de0b6b3a764000077ffffffffffffffffffffffffffffffffffffffffffffffff88168302335f9081526003602052604090205460e08b01519290910492506201000090046bffffffffffffffffffffffff9081169163ffffffff16633b9aca0002828401019081168211156142515750505050505050505050565b335f90815260036020526040902080546bffffffffffffffffffffffff90921662010000027fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff909216919091179055505050505050505050565b5f87876040516142bc929190615988565b6040519081900381206142d3918b90602001615997565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201208383019092525f808452908301819052909250905f5b8781101561449d575f60018587846020811061433d5761433d615507565b61434a91901a601b615863565b8c8c8681811061435c5761435c615507565b905060200201358b8b8781811061437557614375615507565b905060200201356040515f81526020016040526040516143b1949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156143d1573d5f803e3d5ffd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff81165f9081526004602090815290849020838501909452925460ff808216151580855261010090920416938301939093529095509250905061447e576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015160080260ff166001901b840193505080600101905061431f565b5081827e0101010101010101010101010101010101010101010101010101010101010116146127af576040517f8044bb3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f8260600151511115614538576040517fff6c220500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f015160ff168260600151511161457c576040517f5765bdd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b64ffffffffff83166020860152606082015180515f919061459f90600290615950565b815181106145af576145af615507565b602002602001015190508060170b7f000000000000000000000000000000000000000000000000000000000000000060170b138061461257507f000000000000000000000000000000000000000000000000000000000000000060170b8160170b135b15614649576040517fca191b2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408601805190614659826159ad565b63ffffffff90811690915260408051606081018252601785900b815260208781015184168183019081524285168385019081528c85015186165f908152601190935293909120915182549151935185167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff949095167801000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921677ffffffffffffffffffffffffffffffffffffffffffffffff9091161717919091169190911790555081156147925760408087015163ffffffff166060880181905290517f8d530b9ddc4b318d28fdd4c3a21fcfecece54c1a72a824f262985b99afef009b905f90a25b85600d5f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548164ffffffffff021916908364ffffffffff1602179055506040820151815f0160066101000a81548163ffffffff021916908363ffffffff1602179055506060820151815f01600a6101000a81548163ffffffff021916908363ffffffff1602179055506080820151815f01600e6101000a81548163ffffffff021916908363ffffffff16021790555060a0820151815f0160126101000a81548163ffffffff021916908363ffffffff16021790555060c0820151815f0160166101000a81548163ffffffff021916908363ffffffff16021790555060e0820151815f01601a6101000a81548163ffffffff021916908363ffffffff160217905550610100820151815f01601e6101000a81548160ff021916908315150217905550905050856040015163ffffffff167fc797025feeeaf2cd924c99e9205acb8ec04d5cad21c41ce637a38fb6dee6016a8233866020015187606001518860400151895f01518c8c6040516149399897969594939291906159cf565b60405180910390a2604080870151602080860151925163ffffffff93841681525f93909216917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271910160405180910390a3856040015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040516149ca91815260200190565b60405180910390a36149e386604001518260170b614b39565b505050505050565b5f6149f782602061557e565b614a0284602061557e565b614a0e86610144615595565b614a189190615595565b614a229190615595565b614a2c905f615595565b9050368114611ede576040517fb4d895d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81516020614a76919061557e565b614a819060a0615595565b614a8b905f615595565b905080835114612a64576040517fd4e1416000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8383811015614ad957600285850304015b614ae38184613aa6565b95945050505050565b5f81861015614b27576040517ffbf484ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50633b9aca0094039190910101020290565b60408051808201909152600f5473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910463ffffffff166020830152614b8d57505050565b5f614b99600185615561565b63ffffffff8181165f81815260116020526040808220549051602481019390935260170b60448301819052928816606483015260848201879052929350909190614c6b9060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fbeed9b510000000000000000000000000000000000000000000000000000000017905286519087015163ffffffff16611388614ca5565b915050806149e3576040517f1c26714c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805a838110614cd257839003604081048103851015614cd2575f80885160208a015f8a8af19250600191505b5094509492505050565b5080545f8255905f5260205f20908101906113d09190614e11565b828054828255905f5260205f20908101928215614d6f579160200282015b82811115614d6f57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614d15565b50614d7b929150614e11565b5090565b600483019183908215614d6f579160200282015f5b83821115614dd857835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302614d94565b8015614e085782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614dd8565b5050614d7b9291505b5b80821115614d7b575f8155600101614e12565b73ffffffffffffffffffffffffffffffffffffffff811681146113d0575f80fd5b5f60208284031215614e56575f80fd5b813561287e81614e25565b5f81518084525f5b81811015614e8557602081850181015186830182015201614e69565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6110ad6020830184614e61565b5f8060408385031215614ee5575f80fd5b8235614ef081614e25565b91506020830135614f0081614e25565b809150509250929050565b63ffffffff811681146113d0575f80fd5b5f805f805f60a08688031215614f30575f80fd5b8535614f3b81614f0b565b94506020860135614f4b81614f0b565b93506040860135614f5b81614f0b565b92506060860135614f6b81614f0b565b9150608086013562ffffff81168114614f82575f80fd5b809150509295509295909350565b5f815180845260208085019450602084015f5b83811015614fd557815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614fa3565b509495945050505050565b602081525f6110ad6020830184614f90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561506657615066614ff2565b604052919050565b5f82601f83011261507d575f80fd5b813567ffffffffffffffff81111561509757615097614ff2565b6150c860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161501f565b8181528460208386010111156150dc575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215615109575f80fd5b823561511481614e25565b9150602083013567ffffffffffffffff81111561512f575f80fd5b61513b8582860161506e565b9150509250929050565b5f60208284031215615155575f80fd5b813569ffffffffffffffffffff8116811461287e575f80fd5b5f8083601f84011261517e575f80fd5b50813567ffffffffffffffff811115615195575f80fd5b6020830191508360208260051b85010111156151af575f80fd5b9250929050565b5f805f80604085870312156151c9575f80fd5b843567ffffffffffffffff808211156151e0575f80fd5b6151ec8883890161516e565b90965094506020870135915080821115615204575f80fd5b506152118782880161516e565b95989497509550505050565b5f6020828403121561522d575f80fd5b813561287e81614f0b565b5f805f805f805f8060e0898b03121561524f575f80fd5b606089018a81111561525f575f80fd5b8998503567ffffffffffffffff80821115615278575f80fd5b818b0191508b601f83011261528b575f80fd5b813581811115615299575f80fd5b8c60208285010111156152aa575f80fd5b6020830199508098505060808b01359150808211156152c7575f80fd5b6152d38c838d0161516e565b909750955060a08b01359150808211156152eb575f80fd5b506152f88b828c0161516e565b999c989b50969995989497949560c00135949350505050565b5f60208284031215615321575f80fd5b5035919050565b5f8060408385031215615339575f80fd5b823561534481614e25565b946020939093013593505050565b5f67ffffffffffffffff82111561536b5761536b614ff2565b5060051b60200190565b5f82601f830112615384575f80fd5b8135602061539961539483615352565b61501f565b8083825260208201915060208460051b8701019350868411156153ba575f80fd5b602086015b848110156153df5780356153d281614e25565b83529183019183016153bf565b509695505050505050565b803560ff811681146153fa575f80fd5b919050565b803567ffffffffffffffff811681146153fa575f80fd5b5f805f805f8060c0878903121561542b575f80fd5b863567ffffffffffffffff80821115615442575f80fd5b61544e8a838b01615375565b97506020890135915080821115615463575f80fd5b61546f8a838b01615375565b965061547d60408a016153ea565b95506060890135915080821115615492575f80fd5b61549e8a838b0161506e565b94506154ac60808a016153ff565b935060a08901359150808211156154c1575f80fd5b506154ce89828a0161506e565b9150509295509295509295565b5f80604083850312156154ec575f80fd5b82356154f781614e25565b91506020830135614f0081614f0b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b63ffffffff82811682821603908082111561322957613229615534565b80820281158282048414176110b0576110b0615534565b808201808211156110b0576110b0615534565b5f602082840312156155b8575f80fd5b5051919050565b5f602082840312156155cf575f80fd5b8151801515811461287e575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b600181811c9082168061565b57607f821691505b602082108103613ab6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b63ffffffff81811683821601908082111561322957613229615534565b818103818111156110b0576110b0615534565b8181035f83128015838313168383128216171561322957613229615534565b60ff818116838216029081169081811461322957613229615534565b5f61012063ffffffff808d1684528b6020850152808b1660408501525080606084015261572c8184018a614f90565b905082810360808401526157408189614f90565b905060ff871660a084015282810360c084015261575d8187614e61565b905067ffffffffffffffff851660e08401528281036101008401526157828185614e61565b9c9b505050505050505050505050565b5f6101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526157d88285018b614f90565b915083820360808501526157ec828a614f90565b915060ff881660a085015283820360c08501526158098288614e61565b90861660e085015283810361010085015290506157828185614e61565b5f63ffffffff82168061583b5761583b615534565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60ff81811683821601908111156110b0576110b0615534565b8051601781900b81146153fa575f80fd5b5f805f80608085870312156158a0575f80fd5b84516158ab81614f0b565b809450506020808601519350604086015167ffffffffffffffff8111156158d0575f80fd5b8601601f810188136158e0575f80fd5b80516158ee61539482615352565b81815260059190911b8201830190838101908a83111561590c575f80fd5b928401925b82841015615931576159228461587c565b82529284019290840190615911565b80965050505050506159456060860161587c565b905092959194509250565b5f82615983577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818382375f9101908152919050565b8281526080810160608360208401379392505050565b5f63ffffffff8083168181036159c5576159c5615534565b6001019392505050565b5f61010080830160178c60170b8552602073ffffffffffffffffffffffffffffffffffffffff8d16602087015263ffffffff8c1660408701528360608701528293508a518084526101208701945060208c0193505f5b81811015615a43578451840b86529482019493820193600101615a25565b50505050508281036080840152615a5a8188614e61565b915050615a6c60a083018660170b9052565b8360c0830152613b9360e083018464ffffffffff16905256fea164736f6c6343000818000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"link\",\"type\":\"address\",\"internalType\":\"contractLinkTokenInterface\"},{\"name\":\"minAnswer_\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"maxAnswer_\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"billingAccessController\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"},{\"name\":\"requesterAccessController\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"description_\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"secondaryProxy_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"cutoffTime_\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxSyncIterations_\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptPayeeship\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addAccess\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableAccessCheck\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableAccessCheck\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAnswer\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBilling\",\"inputs\":[],\"outputs\":[{\"name\":\"maximumGasPriceGwei\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"reasonableGasPriceGwei\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"observationPaymentGjuels\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"transmissionPaymentGjuels\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"accountingGas\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBillingAccessController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLinkToken\",\"inputs\":[],\"outputs\":[{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"contractLinkTokenInterface\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequesterAccessController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoundData\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"outputs\":[{\"name\":\"roundId_\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTimestamp\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransmitters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatorConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"contractAggregatorValidatorInterface\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasAccess\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_calldata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestAnswer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"configCount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDigestAndEpoch\",\"inputs\":[],\"outputs\":[{\"name\":\"scanLogs\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"epoch\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRound\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRoundData\",\"inputs\":[],\"outputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestTransmissionDetails\",\"inputs\":[],\"outputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"epoch\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"round\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"latestAnswer_\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"latestTimestamp_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"linkAvailableForPayment\",\"inputs\":[],\"outputs\":[{\"name\":\"availableBalance\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxAnswer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minAnswer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"oracleObservationCount\",\"inputs\":[{\"name\":\"transmitterAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owedPayment\",\"inputs\":[{\"name\":\"transmitterAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAccess\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestNewRound\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBilling\",\"inputs\":[{\"name\":\"maximumGasPriceGwei\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"reasonableGasPriceGwei\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"observationPaymentGjuels\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"transmissionPaymentGjuels\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"accountingGas\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBillingAccessController\",\"inputs\":[{\"name\":\"_billingAccessController\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConfig\",\"inputs\":[{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"f\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"onchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCutoffTime\",\"inputs\":[{\"name\":\"_cutoffTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLinkToken\",\"inputs\":[{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"contractLinkTokenInterface\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPayees\",\"inputs\":[{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"payees\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRequesterAccessController\",\"inputs\":[{\"name\":\"requesterAccessController\",\"type\":\"address\",\"internalType\":\"contractAccessControllerInterface\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setValidatorConfig\",\"inputs\":[{\"name\":\"newValidator\",\"type\":\"address\",\"internalType\":\"contractAggregatorValidatorInterface\"},{\"name\":\"newGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferPayeeship\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proposed\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transmit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[3]\",\"internalType\":\"bytes32[3]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"ss\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"rawVs\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transmitSecondary\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[3]\",\"internalType\":\"bytes32[3]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"ss\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"rawVs\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFunds\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawPayment\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AddedAccess\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AnswerUpdated\",\"inputs\":[{\"name\":\"current\",\"type\":\"int256\",\"indexed\":true,\"internalType\":\"int256\"},{\"name\":\"roundId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BillingAccessControllerSet\",\"inputs\":[{\"name\":\"old\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractAccessControllerInterface\"},{\"name\":\"current\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractAccessControllerInterface\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BillingSet\",\"inputs\":[{\"name\":\"maximumGasPriceGwei\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"reasonableGasPriceGwei\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"observationPaymentGjuels\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"transmissionPaymentGjuels\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"accountingGas\",\"type\":\"uint24\",\"indexed\":false,\"internalType\":\"uint24\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckAccessDisabled\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckAccessEnabled\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"configCount\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"f\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"onchainConfig\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CutoffTimeSet\",\"inputs\":[{\"name\":\"cutoffTime\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LinkTokenSet\",\"inputs\":[{\"name\":\"oldLinkToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractLinkTokenInterface\"},{\"name\":\"newLinkToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractLinkTokenInterface\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewRound\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"startedBy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTransmission\",\"inputs\":[{\"name\":\"aggregatorRoundId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"answer\",\"type\":\"int192\",\"indexed\":false,\"internalType\":\"int192\"},{\"name\":\"transmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"observationsTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"observations\",\"type\":\"int192[]\",\"indexed\":false,\"internalType\":\"int192[]\"},{\"name\":\"observers\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"juelsPerFeeCoin\",\"type\":\"int192\",\"indexed\":false,\"internalType\":\"int192\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"epochAndRound\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OraclePaid\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"linkToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractLinkTokenInterface\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PayeeshipTransferRequested\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"current\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"proposed\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PayeeshipTransferred\",\"inputs\":[{\"name\":\"transmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previous\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"current\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PrimaryFeedUnlocked\",\"inputs\":[{\"name\":\"primaryRoundId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemovedAccess\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RequesterAccessControllerSet\",\"inputs\":[{\"name\":\"old\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractAccessControllerInterface\"},{\"name\":\"current\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractAccessControllerInterface\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoundRequested\",\"inputs\":[{\"name\":\"requester\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"epoch\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"round\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SecondaryRoundIdUpdated\",\"inputs\":[{\"name\":\"secondaryRoundId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"epoch\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorConfigSet\",\"inputs\":[{\"name\":\"previousValidator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractAggregatorValidatorInterface\"},{\"name\":\"previousGasLimit\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"currentValidator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"contractAggregatorValidatorInterface\"},{\"name\":\"currentGasLimit\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CalldataLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferPayeeToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FaultyOracleFTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOnChainConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeftGasCannotExceedInitialGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxSyncIterationsReached\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MedianIsOutOfMinMaxRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NumObservationsOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCurrentPayeeCanUpdate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyOwnerAndBillingAdminCanCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyOwnerAndRequesterCanCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPayeeCanWithdraw\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyProposedPayeesCanAccept\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PayeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RepeatedSignerAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RepeatedTransmitterAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RoundNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureError\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaleReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TooFewValuesToTrustMedian\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TooManyOracles\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferRemainingFundsFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransmittersSizeNotEqualPayeeSize\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]}]", +} + +// DualAggregatorABI is the input ABI used to generate the binding from. +// Deprecated: Use DualAggregatorMetaData.ABI instead. +var DualAggregatorABI = DualAggregatorMetaData.ABI + +// DualAggregator is an auto generated Go binding around an Ethereum contract. +type DualAggregator struct { + DualAggregatorCaller // Read-only binding to the contract + DualAggregatorTransactor // Write-only binding to the contract + DualAggregatorFilterer // Log filterer for contract events +} + +// DualAggregatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type DualAggregatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DualAggregatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type DualAggregatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DualAggregatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type DualAggregatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// DualAggregatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type DualAggregatorSession struct { + Contract *DualAggregator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DualAggregatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type DualAggregatorCallerSession struct { + Contract *DualAggregatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// DualAggregatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type DualAggregatorTransactorSession struct { + Contract *DualAggregatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// DualAggregatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type DualAggregatorRaw struct { + Contract *DualAggregator // Generic contract binding to access the raw methods on +} + +// DualAggregatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type DualAggregatorCallerRaw struct { + Contract *DualAggregatorCaller // Generic read-only contract binding to access the raw methods on +} + +// DualAggregatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type DualAggregatorTransactorRaw struct { + Contract *DualAggregatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewDualAggregator creates a new instance of DualAggregator, bound to a specific deployed contract. +func NewDualAggregator(address common.Address, backend bind.ContractBackend) (*DualAggregator, error) { + contract, err := bindDualAggregator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &DualAggregator{DualAggregatorCaller: DualAggregatorCaller{contract: contract}, DualAggregatorTransactor: DualAggregatorTransactor{contract: contract}, DualAggregatorFilterer: DualAggregatorFilterer{contract: contract}}, nil +} + +// NewDualAggregatorCaller creates a new read-only instance of DualAggregator, bound to a specific deployed contract. +func NewDualAggregatorCaller(address common.Address, caller bind.ContractCaller) (*DualAggregatorCaller, error) { + contract, err := bindDualAggregator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &DualAggregatorCaller{contract: contract}, nil +} + +// NewDualAggregatorTransactor creates a new write-only instance of DualAggregator, bound to a specific deployed contract. +func NewDualAggregatorTransactor(address common.Address, transactor bind.ContractTransactor) (*DualAggregatorTransactor, error) { + contract, err := bindDualAggregator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &DualAggregatorTransactor{contract: contract}, nil +} + +// NewDualAggregatorFilterer creates a new log filterer instance of DualAggregator, bound to a specific deployed contract. +func NewDualAggregatorFilterer(address common.Address, filterer bind.ContractFilterer) (*DualAggregatorFilterer, error) { + contract, err := bindDualAggregator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &DualAggregatorFilterer{contract: contract}, nil +} + +// bindDualAggregator binds a generic wrapper to an already deployed contract. +func bindDualAggregator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := DualAggregatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DualAggregator *DualAggregatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DualAggregator.Contract.DualAggregatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DualAggregator *DualAggregatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.Contract.DualAggregatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DualAggregator *DualAggregatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DualAggregator.Contract.DualAggregatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_DualAggregator *DualAggregatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DualAggregator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_DualAggregator *DualAggregatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_DualAggregator *DualAggregatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DualAggregator.Contract.contract.Transact(opts, method, params...) +} + +// CheckEnabled is a free data retrieval call binding the contract method 0xdc7f0124. +// +// Solidity: function checkEnabled() view returns(bool) +func (_DualAggregator *DualAggregatorCaller) CheckEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "checkEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckEnabled is a free data retrieval call binding the contract method 0xdc7f0124. +// +// Solidity: function checkEnabled() view returns(bool) +func (_DualAggregator *DualAggregatorSession) CheckEnabled() (bool, error) { + return _DualAggregator.Contract.CheckEnabled(&_DualAggregator.CallOpts) +} + +// CheckEnabled is a free data retrieval call binding the contract method 0xdc7f0124. +// +// Solidity: function checkEnabled() view returns(bool) +func (_DualAggregator *DualAggregatorCallerSession) CheckEnabled() (bool, error) { + return _DualAggregator.Contract.CheckEnabled(&_DualAggregator.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_DualAggregator *DualAggregatorCaller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_DualAggregator *DualAggregatorSession) Decimals() (uint8, error) { + return _DualAggregator.Contract.Decimals(&_DualAggregator.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_DualAggregator *DualAggregatorCallerSession) Decimals() (uint8, error) { + return _DualAggregator.Contract.Decimals(&_DualAggregator.CallOpts) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_DualAggregator *DualAggregatorCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_DualAggregator *DualAggregatorSession) Description() (string, error) { + return _DualAggregator.Contract.Description(&_DualAggregator.CallOpts) +} + +// Description is a free data retrieval call binding the contract method 0x7284e416. +// +// Solidity: function description() view returns(string) +func (_DualAggregator *DualAggregatorCallerSession) Description() (string, error) { + return _DualAggregator.Contract.Description(&_DualAggregator.CallOpts) +} + +// GetAnswer is a free data retrieval call binding the contract method 0xb5ab58dc. +// +// Solidity: function getAnswer(uint256 roundId) view returns(int256) +func (_DualAggregator *DualAggregatorCaller) GetAnswer(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getAnswer", roundId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetAnswer is a free data retrieval call binding the contract method 0xb5ab58dc. +// +// Solidity: function getAnswer(uint256 roundId) view returns(int256) +func (_DualAggregator *DualAggregatorSession) GetAnswer(roundId *big.Int) (*big.Int, error) { + return _DualAggregator.Contract.GetAnswer(&_DualAggregator.CallOpts, roundId) +} + +// GetAnswer is a free data retrieval call binding the contract method 0xb5ab58dc. +// +// Solidity: function getAnswer(uint256 roundId) view returns(int256) +func (_DualAggregator *DualAggregatorCallerSession) GetAnswer(roundId *big.Int) (*big.Int, error) { + return _DualAggregator.Contract.GetAnswer(&_DualAggregator.CallOpts, roundId) +} + +// GetBilling is a free data retrieval call binding the contract method 0x29937268. +// +// Solidity: function getBilling() view returns(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorCaller) GetBilling(opts *bind.CallOpts) (struct { + MaximumGasPriceGwei uint32 + ReasonableGasPriceGwei uint32 + ObservationPaymentGjuels uint32 + TransmissionPaymentGjuels uint32 + AccountingGas *big.Int +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getBilling") + + outstruct := new(struct { + MaximumGasPriceGwei uint32 + ReasonableGasPriceGwei uint32 + ObservationPaymentGjuels uint32 + TransmissionPaymentGjuels uint32 + AccountingGas *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.MaximumGasPriceGwei = *abi.ConvertType(out[0], new(uint32)).(*uint32) + outstruct.ReasonableGasPriceGwei = *abi.ConvertType(out[1], new(uint32)).(*uint32) + outstruct.ObservationPaymentGjuels = *abi.ConvertType(out[2], new(uint32)).(*uint32) + outstruct.TransmissionPaymentGjuels = *abi.ConvertType(out[3], new(uint32)).(*uint32) + outstruct.AccountingGas = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// GetBilling is a free data retrieval call binding the contract method 0x29937268. +// +// Solidity: function getBilling() view returns(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorSession) GetBilling() (struct { + MaximumGasPriceGwei uint32 + ReasonableGasPriceGwei uint32 + ObservationPaymentGjuels uint32 + TransmissionPaymentGjuels uint32 + AccountingGas *big.Int +}, error) { + return _DualAggregator.Contract.GetBilling(&_DualAggregator.CallOpts) +} + +// GetBilling is a free data retrieval call binding the contract method 0x29937268. +// +// Solidity: function getBilling() view returns(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorCallerSession) GetBilling() (struct { + MaximumGasPriceGwei uint32 + ReasonableGasPriceGwei uint32 + ObservationPaymentGjuels uint32 + TransmissionPaymentGjuels uint32 + AccountingGas *big.Int +}, error) { + return _DualAggregator.Contract.GetBilling(&_DualAggregator.CallOpts) +} + +// GetBillingAccessController is a free data retrieval call binding the contract method 0xc4c92b37. +// +// Solidity: function getBillingAccessController() view returns(address) +func (_DualAggregator *DualAggregatorCaller) GetBillingAccessController(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getBillingAccessController") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetBillingAccessController is a free data retrieval call binding the contract method 0xc4c92b37. +// +// Solidity: function getBillingAccessController() view returns(address) +func (_DualAggregator *DualAggregatorSession) GetBillingAccessController() (common.Address, error) { + return _DualAggregator.Contract.GetBillingAccessController(&_DualAggregator.CallOpts) +} + +// GetBillingAccessController is a free data retrieval call binding the contract method 0xc4c92b37. +// +// Solidity: function getBillingAccessController() view returns(address) +func (_DualAggregator *DualAggregatorCallerSession) GetBillingAccessController() (common.Address, error) { + return _DualAggregator.Contract.GetBillingAccessController(&_DualAggregator.CallOpts) +} + +// GetLinkToken is a free data retrieval call binding the contract method 0xe76d5168. +// +// Solidity: function getLinkToken() view returns(address linkToken) +func (_DualAggregator *DualAggregatorCaller) GetLinkToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getLinkToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetLinkToken is a free data retrieval call binding the contract method 0xe76d5168. +// +// Solidity: function getLinkToken() view returns(address linkToken) +func (_DualAggregator *DualAggregatorSession) GetLinkToken() (common.Address, error) { + return _DualAggregator.Contract.GetLinkToken(&_DualAggregator.CallOpts) +} + +// GetLinkToken is a free data retrieval call binding the contract method 0xe76d5168. +// +// Solidity: function getLinkToken() view returns(address linkToken) +func (_DualAggregator *DualAggregatorCallerSession) GetLinkToken() (common.Address, error) { + return _DualAggregator.Contract.GetLinkToken(&_DualAggregator.CallOpts) +} + +// GetRequesterAccessController is a free data retrieval call binding the contract method 0xdaffc4b5. +// +// Solidity: function getRequesterAccessController() view returns(address) +func (_DualAggregator *DualAggregatorCaller) GetRequesterAccessController(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getRequesterAccessController") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetRequesterAccessController is a free data retrieval call binding the contract method 0xdaffc4b5. +// +// Solidity: function getRequesterAccessController() view returns(address) +func (_DualAggregator *DualAggregatorSession) GetRequesterAccessController() (common.Address, error) { + return _DualAggregator.Contract.GetRequesterAccessController(&_DualAggregator.CallOpts) +} + +// GetRequesterAccessController is a free data retrieval call binding the contract method 0xdaffc4b5. +// +// Solidity: function getRequesterAccessController() view returns(address) +func (_DualAggregator *DualAggregatorCallerSession) GetRequesterAccessController() (common.Address, error) { + return _DualAggregator.Contract.GetRequesterAccessController(&_DualAggregator.CallOpts) +} + +// GetRoundData is a free data retrieval call binding the contract method 0x9a6fc8f5. +// +// Solidity: function getRoundData(uint80 roundId) view returns(uint80 roundId_, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorCaller) GetRoundData(opts *bind.CallOpts, roundId *big.Int) (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getRoundData", roundId) + + outstruct := new(struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.RoundId = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.Answer = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.StartedAt = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.UpdatedAt = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.AnsweredInRound = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// GetRoundData is a free data retrieval call binding the contract method 0x9a6fc8f5. +// +// Solidity: function getRoundData(uint80 roundId) view returns(uint80 roundId_, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorSession) GetRoundData(roundId *big.Int) (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + return _DualAggregator.Contract.GetRoundData(&_DualAggregator.CallOpts, roundId) +} + +// GetRoundData is a free data retrieval call binding the contract method 0x9a6fc8f5. +// +// Solidity: function getRoundData(uint80 roundId) view returns(uint80 roundId_, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorCallerSession) GetRoundData(roundId *big.Int) (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + return _DualAggregator.Contract.GetRoundData(&_DualAggregator.CallOpts, roundId) +} + +// GetTimestamp is a free data retrieval call binding the contract method 0xb633620c. +// +// Solidity: function getTimestamp(uint256 roundId) view returns(uint256) +func (_DualAggregator *DualAggregatorCaller) GetTimestamp(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getTimestamp", roundId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTimestamp is a free data retrieval call binding the contract method 0xb633620c. +// +// Solidity: function getTimestamp(uint256 roundId) view returns(uint256) +func (_DualAggregator *DualAggregatorSession) GetTimestamp(roundId *big.Int) (*big.Int, error) { + return _DualAggregator.Contract.GetTimestamp(&_DualAggregator.CallOpts, roundId) +} + +// GetTimestamp is a free data retrieval call binding the contract method 0xb633620c. +// +// Solidity: function getTimestamp(uint256 roundId) view returns(uint256) +func (_DualAggregator *DualAggregatorCallerSession) GetTimestamp(roundId *big.Int) (*big.Int, error) { + return _DualAggregator.Contract.GetTimestamp(&_DualAggregator.CallOpts, roundId) +} + +// GetTransmitters is a free data retrieval call binding the contract method 0x666cab8d. +// +// Solidity: function getTransmitters() view returns(address[]) +func (_DualAggregator *DualAggregatorCaller) GetTransmitters(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getTransmitters") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetTransmitters is a free data retrieval call binding the contract method 0x666cab8d. +// +// Solidity: function getTransmitters() view returns(address[]) +func (_DualAggregator *DualAggregatorSession) GetTransmitters() ([]common.Address, error) { + return _DualAggregator.Contract.GetTransmitters(&_DualAggregator.CallOpts) +} + +// GetTransmitters is a free data retrieval call binding the contract method 0x666cab8d. +// +// Solidity: function getTransmitters() view returns(address[]) +func (_DualAggregator *DualAggregatorCallerSession) GetTransmitters() ([]common.Address, error) { + return _DualAggregator.Contract.GetTransmitters(&_DualAggregator.CallOpts) +} + +// GetValidatorConfig is a free data retrieval call binding the contract method 0x9bd2c0b1. +// +// Solidity: function getValidatorConfig() view returns(address validator, uint32 gasLimit) +func (_DualAggregator *DualAggregatorCaller) GetValidatorConfig(opts *bind.CallOpts) (struct { + Validator common.Address + GasLimit uint32 +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "getValidatorConfig") + + outstruct := new(struct { + Validator common.Address + GasLimit uint32 + }) + if err != nil { + return *outstruct, err + } + + outstruct.Validator = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.GasLimit = *abi.ConvertType(out[1], new(uint32)).(*uint32) + + return *outstruct, err + +} + +// GetValidatorConfig is a free data retrieval call binding the contract method 0x9bd2c0b1. +// +// Solidity: function getValidatorConfig() view returns(address validator, uint32 gasLimit) +func (_DualAggregator *DualAggregatorSession) GetValidatorConfig() (struct { + Validator common.Address + GasLimit uint32 +}, error) { + return _DualAggregator.Contract.GetValidatorConfig(&_DualAggregator.CallOpts) +} + +// GetValidatorConfig is a free data retrieval call binding the contract method 0x9bd2c0b1. +// +// Solidity: function getValidatorConfig() view returns(address validator, uint32 gasLimit) +func (_DualAggregator *DualAggregatorCallerSession) GetValidatorConfig() (struct { + Validator common.Address + GasLimit uint32 +}, error) { + return _DualAggregator.Contract.GetValidatorConfig(&_DualAggregator.CallOpts) +} + +// HasAccess is a free data retrieval call binding the contract method 0x6b14daf8. +// +// Solidity: function hasAccess(address _user, bytes _calldata) view returns(bool) +func (_DualAggregator *DualAggregatorCaller) HasAccess(opts *bind.CallOpts, _user common.Address, _calldata []byte) (bool, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "hasAccess", _user, _calldata) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasAccess is a free data retrieval call binding the contract method 0x6b14daf8. +// +// Solidity: function hasAccess(address _user, bytes _calldata) view returns(bool) +func (_DualAggregator *DualAggregatorSession) HasAccess(_user common.Address, _calldata []byte) (bool, error) { + return _DualAggregator.Contract.HasAccess(&_DualAggregator.CallOpts, _user, _calldata) +} + +// HasAccess is a free data retrieval call binding the contract method 0x6b14daf8. +// +// Solidity: function hasAccess(address _user, bytes _calldata) view returns(bool) +func (_DualAggregator *DualAggregatorCallerSession) HasAccess(_user common.Address, _calldata []byte) (bool, error) { + return _DualAggregator.Contract.HasAccess(&_DualAggregator.CallOpts, _user, _calldata) +} + +// LatestAnswer is a free data retrieval call binding the contract method 0x50d25bcd. +// +// Solidity: function latestAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCaller) LatestAnswer(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestAnswer") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LatestAnswer is a free data retrieval call binding the contract method 0x50d25bcd. +// +// Solidity: function latestAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorSession) LatestAnswer() (*big.Int, error) { + return _DualAggregator.Contract.LatestAnswer(&_DualAggregator.CallOpts) +} + +// LatestAnswer is a free data retrieval call binding the contract method 0x50d25bcd. +// +// Solidity: function latestAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCallerSession) LatestAnswer() (*big.Int, error) { + return _DualAggregator.Contract.LatestAnswer(&_DualAggregator.CallOpts) +} + +// LatestConfigDetails is a free data retrieval call binding the contract method 0x81ff7048. +// +// Solidity: function latestConfigDetails() view returns(uint32 configCount, uint32 blockNumber, bytes32 configDigest) +func (_DualAggregator *DualAggregatorCaller) LatestConfigDetails(opts *bind.CallOpts) (struct { + ConfigCount uint32 + BlockNumber uint32 + ConfigDigest [32]byte +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestConfigDetails") + + outstruct := new(struct { + ConfigCount uint32 + BlockNumber uint32 + ConfigDigest [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.ConfigCount = *abi.ConvertType(out[0], new(uint32)).(*uint32) + outstruct.BlockNumber = *abi.ConvertType(out[1], new(uint32)).(*uint32) + outstruct.ConfigDigest = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// LatestConfigDetails is a free data retrieval call binding the contract method 0x81ff7048. +// +// Solidity: function latestConfigDetails() view returns(uint32 configCount, uint32 blockNumber, bytes32 configDigest) +func (_DualAggregator *DualAggregatorSession) LatestConfigDetails() (struct { + ConfigCount uint32 + BlockNumber uint32 + ConfigDigest [32]byte +}, error) { + return _DualAggregator.Contract.LatestConfigDetails(&_DualAggregator.CallOpts) +} + +// LatestConfigDetails is a free data retrieval call binding the contract method 0x81ff7048. +// +// Solidity: function latestConfigDetails() view returns(uint32 configCount, uint32 blockNumber, bytes32 configDigest) +func (_DualAggregator *DualAggregatorCallerSession) LatestConfigDetails() (struct { + ConfigCount uint32 + BlockNumber uint32 + ConfigDigest [32]byte +}, error) { + return _DualAggregator.Contract.LatestConfigDetails(&_DualAggregator.CallOpts) +} + +// LatestConfigDigestAndEpoch is a free data retrieval call binding the contract method 0xafcb95d7. +// +// Solidity: function latestConfigDigestAndEpoch() view returns(bool scanLogs, bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorCaller) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (struct { + ScanLogs bool + ConfigDigest [32]byte + Epoch uint32 +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestConfigDigestAndEpoch") + + outstruct := new(struct { + ScanLogs bool + ConfigDigest [32]byte + Epoch uint32 + }) + if err != nil { + return *outstruct, err + } + + outstruct.ScanLogs = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.ConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.Epoch = *abi.ConvertType(out[2], new(uint32)).(*uint32) + + return *outstruct, err + +} + +// LatestConfigDigestAndEpoch is a free data retrieval call binding the contract method 0xafcb95d7. +// +// Solidity: function latestConfigDigestAndEpoch() view returns(bool scanLogs, bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorSession) LatestConfigDigestAndEpoch() (struct { + ScanLogs bool + ConfigDigest [32]byte + Epoch uint32 +}, error) { + return _DualAggregator.Contract.LatestConfigDigestAndEpoch(&_DualAggregator.CallOpts) +} + +// LatestConfigDigestAndEpoch is a free data retrieval call binding the contract method 0xafcb95d7. +// +// Solidity: function latestConfigDigestAndEpoch() view returns(bool scanLogs, bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorCallerSession) LatestConfigDigestAndEpoch() (struct { + ScanLogs bool + ConfigDigest [32]byte + Epoch uint32 +}, error) { + return _DualAggregator.Contract.LatestConfigDigestAndEpoch(&_DualAggregator.CallOpts) +} + +// LatestRound is a free data retrieval call binding the contract method 0x668a0f02. +// +// Solidity: function latestRound() view returns(uint256) +func (_DualAggregator *DualAggregatorCaller) LatestRound(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestRound") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LatestRound is a free data retrieval call binding the contract method 0x668a0f02. +// +// Solidity: function latestRound() view returns(uint256) +func (_DualAggregator *DualAggregatorSession) LatestRound() (*big.Int, error) { + return _DualAggregator.Contract.LatestRound(&_DualAggregator.CallOpts) +} + +// LatestRound is a free data retrieval call binding the contract method 0x668a0f02. +// +// Solidity: function latestRound() view returns(uint256) +func (_DualAggregator *DualAggregatorCallerSession) LatestRound() (*big.Int, error) { + return _DualAggregator.Contract.LatestRound(&_DualAggregator.CallOpts) +} + +// LatestRoundData is a free data retrieval call binding the contract method 0xfeaf968c. +// +// Solidity: function latestRoundData() view returns(uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorCaller) LatestRoundData(opts *bind.CallOpts) (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestRoundData") + + outstruct := new(struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.RoundId = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.Answer = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.StartedAt = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.UpdatedAt = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.AnsweredInRound = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// LatestRoundData is a free data retrieval call binding the contract method 0xfeaf968c. +// +// Solidity: function latestRoundData() view returns(uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorSession) LatestRoundData() (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + return _DualAggregator.Contract.LatestRoundData(&_DualAggregator.CallOpts) +} + +// LatestRoundData is a free data retrieval call binding the contract method 0xfeaf968c. +// +// Solidity: function latestRoundData() view returns(uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +func (_DualAggregator *DualAggregatorCallerSession) LatestRoundData() (struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +}, error) { + return _DualAggregator.Contract.LatestRoundData(&_DualAggregator.CallOpts) +} + +// LatestTimestamp is a free data retrieval call binding the contract method 0x8205bf6a. +// +// Solidity: function latestTimestamp() view returns(uint256) +func (_DualAggregator *DualAggregatorCaller) LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestTimestamp") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LatestTimestamp is a free data retrieval call binding the contract method 0x8205bf6a. +// +// Solidity: function latestTimestamp() view returns(uint256) +func (_DualAggregator *DualAggregatorSession) LatestTimestamp() (*big.Int, error) { + return _DualAggregator.Contract.LatestTimestamp(&_DualAggregator.CallOpts) +} + +// LatestTimestamp is a free data retrieval call binding the contract method 0x8205bf6a. +// +// Solidity: function latestTimestamp() view returns(uint256) +func (_DualAggregator *DualAggregatorCallerSession) LatestTimestamp() (*big.Int, error) { + return _DualAggregator.Contract.LatestTimestamp(&_DualAggregator.CallOpts) +} + +// LatestTransmissionDetails is a free data retrieval call binding the contract method 0xe5fe4577. +// +// Solidity: function latestTransmissionDetails() view returns(bytes32 configDigest, uint32 epoch, uint8 round, int192 latestAnswer_, uint64 latestTimestamp_) +func (_DualAggregator *DualAggregatorCaller) LatestTransmissionDetails(opts *bind.CallOpts) (struct { + ConfigDigest [32]byte + Epoch uint32 + Round uint8 + LatestAnswer *big.Int + LatestTimestamp uint64 +}, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "latestTransmissionDetails") + + outstruct := new(struct { + ConfigDigest [32]byte + Epoch uint32 + Round uint8 + LatestAnswer *big.Int + LatestTimestamp uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.ConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.Epoch = *abi.ConvertType(out[1], new(uint32)).(*uint32) + outstruct.Round = *abi.ConvertType(out[2], new(uint8)).(*uint8) + outstruct.LatestAnswer = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.LatestTimestamp = *abi.ConvertType(out[4], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// LatestTransmissionDetails is a free data retrieval call binding the contract method 0xe5fe4577. +// +// Solidity: function latestTransmissionDetails() view returns(bytes32 configDigest, uint32 epoch, uint8 round, int192 latestAnswer_, uint64 latestTimestamp_) +func (_DualAggregator *DualAggregatorSession) LatestTransmissionDetails() (struct { + ConfigDigest [32]byte + Epoch uint32 + Round uint8 + LatestAnswer *big.Int + LatestTimestamp uint64 +}, error) { + return _DualAggregator.Contract.LatestTransmissionDetails(&_DualAggregator.CallOpts) +} + +// LatestTransmissionDetails is a free data retrieval call binding the contract method 0xe5fe4577. +// +// Solidity: function latestTransmissionDetails() view returns(bytes32 configDigest, uint32 epoch, uint8 round, int192 latestAnswer_, uint64 latestTimestamp_) +func (_DualAggregator *DualAggregatorCallerSession) LatestTransmissionDetails() (struct { + ConfigDigest [32]byte + Epoch uint32 + Round uint8 + LatestAnswer *big.Int + LatestTimestamp uint64 +}, error) { + return _DualAggregator.Contract.LatestTransmissionDetails(&_DualAggregator.CallOpts) +} + +// LinkAvailableForPayment is a free data retrieval call binding the contract method 0xd09dc339. +// +// Solidity: function linkAvailableForPayment() view returns(int256 availableBalance) +func (_DualAggregator *DualAggregatorCaller) LinkAvailableForPayment(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "linkAvailableForPayment") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LinkAvailableForPayment is a free data retrieval call binding the contract method 0xd09dc339. +// +// Solidity: function linkAvailableForPayment() view returns(int256 availableBalance) +func (_DualAggregator *DualAggregatorSession) LinkAvailableForPayment() (*big.Int, error) { + return _DualAggregator.Contract.LinkAvailableForPayment(&_DualAggregator.CallOpts) +} + +// LinkAvailableForPayment is a free data retrieval call binding the contract method 0xd09dc339. +// +// Solidity: function linkAvailableForPayment() view returns(int256 availableBalance) +func (_DualAggregator *DualAggregatorCallerSession) LinkAvailableForPayment() (*big.Int, error) { + return _DualAggregator.Contract.LinkAvailableForPayment(&_DualAggregator.CallOpts) +} + +// MaxAnswer is a free data retrieval call binding the contract method 0x70da2f67. +// +// Solidity: function maxAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCaller) MaxAnswer(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "maxAnswer") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MaxAnswer is a free data retrieval call binding the contract method 0x70da2f67. +// +// Solidity: function maxAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorSession) MaxAnswer() (*big.Int, error) { + return _DualAggregator.Contract.MaxAnswer(&_DualAggregator.CallOpts) +} + +// MaxAnswer is a free data retrieval call binding the contract method 0x70da2f67. +// +// Solidity: function maxAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCallerSession) MaxAnswer() (*big.Int, error) { + return _DualAggregator.Contract.MaxAnswer(&_DualAggregator.CallOpts) +} + +// MinAnswer is a free data retrieval call binding the contract method 0x22adbc78. +// +// Solidity: function minAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCaller) MinAnswer(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "minAnswer") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MinAnswer is a free data retrieval call binding the contract method 0x22adbc78. +// +// Solidity: function minAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorSession) MinAnswer() (*big.Int, error) { + return _DualAggregator.Contract.MinAnswer(&_DualAggregator.CallOpts) +} + +// MinAnswer is a free data retrieval call binding the contract method 0x22adbc78. +// +// Solidity: function minAnswer() view returns(int256) +func (_DualAggregator *DualAggregatorCallerSession) MinAnswer() (*big.Int, error) { + return _DualAggregator.Contract.MinAnswer(&_DualAggregator.CallOpts) +} + +// OracleObservationCount is a free data retrieval call binding the contract method 0xe4902f82. +// +// Solidity: function oracleObservationCount(address transmitterAddress) view returns(uint32) +func (_DualAggregator *DualAggregatorCaller) OracleObservationCount(opts *bind.CallOpts, transmitterAddress common.Address) (uint32, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "oracleObservationCount", transmitterAddress) + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// OracleObservationCount is a free data retrieval call binding the contract method 0xe4902f82. +// +// Solidity: function oracleObservationCount(address transmitterAddress) view returns(uint32) +func (_DualAggregator *DualAggregatorSession) OracleObservationCount(transmitterAddress common.Address) (uint32, error) { + return _DualAggregator.Contract.OracleObservationCount(&_DualAggregator.CallOpts, transmitterAddress) +} + +// OracleObservationCount is a free data retrieval call binding the contract method 0xe4902f82. +// +// Solidity: function oracleObservationCount(address transmitterAddress) view returns(uint32) +func (_DualAggregator *DualAggregatorCallerSession) OracleObservationCount(transmitterAddress common.Address) (uint32, error) { + return _DualAggregator.Contract.OracleObservationCount(&_DualAggregator.CallOpts, transmitterAddress) +} + +// OwedPayment is a free data retrieval call binding the contract method 0x0eafb25b. +// +// Solidity: function owedPayment(address transmitterAddress) view returns(uint256) +func (_DualAggregator *DualAggregatorCaller) OwedPayment(opts *bind.CallOpts, transmitterAddress common.Address) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "owedPayment", transmitterAddress) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// OwedPayment is a free data retrieval call binding the contract method 0x0eafb25b. +// +// Solidity: function owedPayment(address transmitterAddress) view returns(uint256) +func (_DualAggregator *DualAggregatorSession) OwedPayment(transmitterAddress common.Address) (*big.Int, error) { + return _DualAggregator.Contract.OwedPayment(&_DualAggregator.CallOpts, transmitterAddress) +} + +// OwedPayment is a free data retrieval call binding the contract method 0x0eafb25b. +// +// Solidity: function owedPayment(address transmitterAddress) view returns(uint256) +func (_DualAggregator *DualAggregatorCallerSession) OwedPayment(transmitterAddress common.Address) (*big.Int, error) { + return _DualAggregator.Contract.OwedPayment(&_DualAggregator.CallOpts, transmitterAddress) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DualAggregator *DualAggregatorCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DualAggregator *DualAggregatorSession) Owner() (common.Address, error) { + return _DualAggregator.Contract.Owner(&_DualAggregator.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_DualAggregator *DualAggregatorCallerSession) Owner() (common.Address, error) { + return _DualAggregator.Contract.Owner(&_DualAggregator.CallOpts) +} + +// TypeAndVersion is a free data retrieval call binding the contract method 0x181f5a77. +// +// Solidity: function typeAndVersion() view returns(string) +func (_DualAggregator *DualAggregatorCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// TypeAndVersion is a free data retrieval call binding the contract method 0x181f5a77. +// +// Solidity: function typeAndVersion() view returns(string) +func (_DualAggregator *DualAggregatorSession) TypeAndVersion() (string, error) { + return _DualAggregator.Contract.TypeAndVersion(&_DualAggregator.CallOpts) +} + +// TypeAndVersion is a free data retrieval call binding the contract method 0x181f5a77. +// +// Solidity: function typeAndVersion() view returns(string) +func (_DualAggregator *DualAggregatorCallerSession) TypeAndVersion() (string, error) { + return _DualAggregator.Contract.TypeAndVersion(&_DualAggregator.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(uint256) +func (_DualAggregator *DualAggregatorCaller) Version(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DualAggregator.contract.Call(opts, &out, "version") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(uint256) +func (_DualAggregator *DualAggregatorSession) Version() (*big.Int, error) { + return _DualAggregator.Contract.Version(&_DualAggregator.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(uint256) +func (_DualAggregator *DualAggregatorCallerSession) Version() (*big.Int, error) { + return _DualAggregator.Contract.Version(&_DualAggregator.CallOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_DualAggregator *DualAggregatorTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "acceptOwnership") +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_DualAggregator *DualAggregatorSession) AcceptOwnership() (*types.Transaction, error) { + return _DualAggregator.Contract.AcceptOwnership(&_DualAggregator.TransactOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_DualAggregator *DualAggregatorTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _DualAggregator.Contract.AcceptOwnership(&_DualAggregator.TransactOpts) +} + +// AcceptPayeeship is a paid mutator transaction binding the contract method 0xb121e147. +// +// Solidity: function acceptPayeeship(address transmitter) returns() +func (_DualAggregator *DualAggregatorTransactor) AcceptPayeeship(opts *bind.TransactOpts, transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "acceptPayeeship", transmitter) +} + +// AcceptPayeeship is a paid mutator transaction binding the contract method 0xb121e147. +// +// Solidity: function acceptPayeeship(address transmitter) returns() +func (_DualAggregator *DualAggregatorSession) AcceptPayeeship(transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.AcceptPayeeship(&_DualAggregator.TransactOpts, transmitter) +} + +// AcceptPayeeship is a paid mutator transaction binding the contract method 0xb121e147. +// +// Solidity: function acceptPayeeship(address transmitter) returns() +func (_DualAggregator *DualAggregatorTransactorSession) AcceptPayeeship(transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.AcceptPayeeship(&_DualAggregator.TransactOpts, transmitter) +} + +// AddAccess is a paid mutator transaction binding the contract method 0xa118f249. +// +// Solidity: function addAccess(address _user) returns() +func (_DualAggregator *DualAggregatorTransactor) AddAccess(opts *bind.TransactOpts, _user common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "addAccess", _user) +} + +// AddAccess is a paid mutator transaction binding the contract method 0xa118f249. +// +// Solidity: function addAccess(address _user) returns() +func (_DualAggregator *DualAggregatorSession) AddAccess(_user common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.AddAccess(&_DualAggregator.TransactOpts, _user) +} + +// AddAccess is a paid mutator transaction binding the contract method 0xa118f249. +// +// Solidity: function addAccess(address _user) returns() +func (_DualAggregator *DualAggregatorTransactorSession) AddAccess(_user common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.AddAccess(&_DualAggregator.TransactOpts, _user) +} + +// DisableAccessCheck is a paid mutator transaction binding the contract method 0x0a756983. +// +// Solidity: function disableAccessCheck() returns() +func (_DualAggregator *DualAggregatorTransactor) DisableAccessCheck(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "disableAccessCheck") +} + +// DisableAccessCheck is a paid mutator transaction binding the contract method 0x0a756983. +// +// Solidity: function disableAccessCheck() returns() +func (_DualAggregator *DualAggregatorSession) DisableAccessCheck() (*types.Transaction, error) { + return _DualAggregator.Contract.DisableAccessCheck(&_DualAggregator.TransactOpts) +} + +// DisableAccessCheck is a paid mutator transaction binding the contract method 0x0a756983. +// +// Solidity: function disableAccessCheck() returns() +func (_DualAggregator *DualAggregatorTransactorSession) DisableAccessCheck() (*types.Transaction, error) { + return _DualAggregator.Contract.DisableAccessCheck(&_DualAggregator.TransactOpts) +} + +// EnableAccessCheck is a paid mutator transaction binding the contract method 0x8038e4a1. +// +// Solidity: function enableAccessCheck() returns() +func (_DualAggregator *DualAggregatorTransactor) EnableAccessCheck(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "enableAccessCheck") +} + +// EnableAccessCheck is a paid mutator transaction binding the contract method 0x8038e4a1. +// +// Solidity: function enableAccessCheck() returns() +func (_DualAggregator *DualAggregatorSession) EnableAccessCheck() (*types.Transaction, error) { + return _DualAggregator.Contract.EnableAccessCheck(&_DualAggregator.TransactOpts) +} + +// EnableAccessCheck is a paid mutator transaction binding the contract method 0x8038e4a1. +// +// Solidity: function enableAccessCheck() returns() +func (_DualAggregator *DualAggregatorTransactorSession) EnableAccessCheck() (*types.Transaction, error) { + return _DualAggregator.Contract.EnableAccessCheck(&_DualAggregator.TransactOpts) +} + +// RemoveAccess is a paid mutator transaction binding the contract method 0x8823da6c. +// +// Solidity: function removeAccess(address _user) returns() +func (_DualAggregator *DualAggregatorTransactor) RemoveAccess(opts *bind.TransactOpts, _user common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "removeAccess", _user) +} + +// RemoveAccess is a paid mutator transaction binding the contract method 0x8823da6c. +// +// Solidity: function removeAccess(address _user) returns() +func (_DualAggregator *DualAggregatorSession) RemoveAccess(_user common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.RemoveAccess(&_DualAggregator.TransactOpts, _user) +} + +// RemoveAccess is a paid mutator transaction binding the contract method 0x8823da6c. +// +// Solidity: function removeAccess(address _user) returns() +func (_DualAggregator *DualAggregatorTransactorSession) RemoveAccess(_user common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.RemoveAccess(&_DualAggregator.TransactOpts, _user) +} + +// RequestNewRound is a paid mutator transaction binding the contract method 0x98e5b12a. +// +// Solidity: function requestNewRound() returns(uint80) +func (_DualAggregator *DualAggregatorTransactor) RequestNewRound(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "requestNewRound") +} + +// RequestNewRound is a paid mutator transaction binding the contract method 0x98e5b12a. +// +// Solidity: function requestNewRound() returns(uint80) +func (_DualAggregator *DualAggregatorSession) RequestNewRound() (*types.Transaction, error) { + return _DualAggregator.Contract.RequestNewRound(&_DualAggregator.TransactOpts) +} + +// RequestNewRound is a paid mutator transaction binding the contract method 0x98e5b12a. +// +// Solidity: function requestNewRound() returns(uint80) +func (_DualAggregator *DualAggregatorTransactorSession) RequestNewRound() (*types.Transaction, error) { + return _DualAggregator.Contract.RequestNewRound(&_DualAggregator.TransactOpts) +} + +// SetBilling is a paid mutator transaction binding the contract method 0x643dc105. +// +// Solidity: function setBilling(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) returns() +func (_DualAggregator *DualAggregatorTransactor) SetBilling(opts *bind.TransactOpts, maximumGasPriceGwei uint32, reasonableGasPriceGwei uint32, observationPaymentGjuels uint32, transmissionPaymentGjuels uint32, accountingGas *big.Int) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setBilling", maximumGasPriceGwei, reasonableGasPriceGwei, observationPaymentGjuels, transmissionPaymentGjuels, accountingGas) +} + +// SetBilling is a paid mutator transaction binding the contract method 0x643dc105. +// +// Solidity: function setBilling(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) returns() +func (_DualAggregator *DualAggregatorSession) SetBilling(maximumGasPriceGwei uint32, reasonableGasPriceGwei uint32, observationPaymentGjuels uint32, transmissionPaymentGjuels uint32, accountingGas *big.Int) (*types.Transaction, error) { + return _DualAggregator.Contract.SetBilling(&_DualAggregator.TransactOpts, maximumGasPriceGwei, reasonableGasPriceGwei, observationPaymentGjuels, transmissionPaymentGjuels, accountingGas) +} + +// SetBilling is a paid mutator transaction binding the contract method 0x643dc105. +// +// Solidity: function setBilling(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetBilling(maximumGasPriceGwei uint32, reasonableGasPriceGwei uint32, observationPaymentGjuels uint32, transmissionPaymentGjuels uint32, accountingGas *big.Int) (*types.Transaction, error) { + return _DualAggregator.Contract.SetBilling(&_DualAggregator.TransactOpts, maximumGasPriceGwei, reasonableGasPriceGwei, observationPaymentGjuels, transmissionPaymentGjuels, accountingGas) +} + +// SetBillingAccessController is a paid mutator transaction binding the contract method 0xfbffd2c1. +// +// Solidity: function setBillingAccessController(address _billingAccessController) returns() +func (_DualAggregator *DualAggregatorTransactor) SetBillingAccessController(opts *bind.TransactOpts, _billingAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setBillingAccessController", _billingAccessController) +} + +// SetBillingAccessController is a paid mutator transaction binding the contract method 0xfbffd2c1. +// +// Solidity: function setBillingAccessController(address _billingAccessController) returns() +func (_DualAggregator *DualAggregatorSession) SetBillingAccessController(_billingAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetBillingAccessController(&_DualAggregator.TransactOpts, _billingAccessController) +} + +// SetBillingAccessController is a paid mutator transaction binding the contract method 0xfbffd2c1. +// +// Solidity: function setBillingAccessController(address _billingAccessController) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetBillingAccessController(_billingAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetBillingAccessController(&_DualAggregator.TransactOpts, _billingAccessController) +} + +// SetConfig is a paid mutator transaction binding the contract method 0xe3d0e712. +// +// Solidity: function setConfig(address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) returns() +func (_DualAggregator *DualAggregatorTransactor) SetConfig(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setConfig", signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +} + +// SetConfig is a paid mutator transaction binding the contract method 0xe3d0e712. +// +// Solidity: function setConfig(address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) returns() +func (_DualAggregator *DualAggregatorSession) SetConfig(signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { + return _DualAggregator.Contract.SetConfig(&_DualAggregator.TransactOpts, signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +} + +// SetConfig is a paid mutator transaction binding the contract method 0xe3d0e712. +// +// Solidity: function setConfig(address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetConfig(signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { + return _DualAggregator.Contract.SetConfig(&_DualAggregator.TransactOpts, signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +} + +// SetCutoffTime is a paid mutator transaction binding the contract method 0xb17f2a6b. +// +// Solidity: function setCutoffTime(uint32 _cutoffTime) returns() +func (_DualAggregator *DualAggregatorTransactor) SetCutoffTime(opts *bind.TransactOpts, _cutoffTime uint32) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setCutoffTime", _cutoffTime) +} + +// SetCutoffTime is a paid mutator transaction binding the contract method 0xb17f2a6b. +// +// Solidity: function setCutoffTime(uint32 _cutoffTime) returns() +func (_DualAggregator *DualAggregatorSession) SetCutoffTime(_cutoffTime uint32) (*types.Transaction, error) { + return _DualAggregator.Contract.SetCutoffTime(&_DualAggregator.TransactOpts, _cutoffTime) +} + +// SetCutoffTime is a paid mutator transaction binding the contract method 0xb17f2a6b. +// +// Solidity: function setCutoffTime(uint32 _cutoffTime) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetCutoffTime(_cutoffTime uint32) (*types.Transaction, error) { + return _DualAggregator.Contract.SetCutoffTime(&_DualAggregator.TransactOpts, _cutoffTime) +} + +// SetLinkToken is a paid mutator transaction binding the contract method 0x4fb17470. +// +// Solidity: function setLinkToken(address linkToken, address recipient) returns() +func (_DualAggregator *DualAggregatorTransactor) SetLinkToken(opts *bind.TransactOpts, linkToken common.Address, recipient common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setLinkToken", linkToken, recipient) +} + +// SetLinkToken is a paid mutator transaction binding the contract method 0x4fb17470. +// +// Solidity: function setLinkToken(address linkToken, address recipient) returns() +func (_DualAggregator *DualAggregatorSession) SetLinkToken(linkToken common.Address, recipient common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetLinkToken(&_DualAggregator.TransactOpts, linkToken, recipient) +} + +// SetLinkToken is a paid mutator transaction binding the contract method 0x4fb17470. +// +// Solidity: function setLinkToken(address linkToken, address recipient) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetLinkToken(linkToken common.Address, recipient common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetLinkToken(&_DualAggregator.TransactOpts, linkToken, recipient) +} + +// SetPayees is a paid mutator transaction binding the contract method 0x9c849b30. +// +// Solidity: function setPayees(address[] transmitters, address[] payees) returns() +func (_DualAggregator *DualAggregatorTransactor) SetPayees(opts *bind.TransactOpts, transmitters []common.Address, payees []common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setPayees", transmitters, payees) +} + +// SetPayees is a paid mutator transaction binding the contract method 0x9c849b30. +// +// Solidity: function setPayees(address[] transmitters, address[] payees) returns() +func (_DualAggregator *DualAggregatorSession) SetPayees(transmitters []common.Address, payees []common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetPayees(&_DualAggregator.TransactOpts, transmitters, payees) +} + +// SetPayees is a paid mutator transaction binding the contract method 0x9c849b30. +// +// Solidity: function setPayees(address[] transmitters, address[] payees) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetPayees(transmitters []common.Address, payees []common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetPayees(&_DualAggregator.TransactOpts, transmitters, payees) +} + +// SetRequesterAccessController is a paid mutator transaction binding the contract method 0x9e3ceeab. +// +// Solidity: function setRequesterAccessController(address requesterAccessController) returns() +func (_DualAggregator *DualAggregatorTransactor) SetRequesterAccessController(opts *bind.TransactOpts, requesterAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setRequesterAccessController", requesterAccessController) +} + +// SetRequesterAccessController is a paid mutator transaction binding the contract method 0x9e3ceeab. +// +// Solidity: function setRequesterAccessController(address requesterAccessController) returns() +func (_DualAggregator *DualAggregatorSession) SetRequesterAccessController(requesterAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetRequesterAccessController(&_DualAggregator.TransactOpts, requesterAccessController) +} + +// SetRequesterAccessController is a paid mutator transaction binding the contract method 0x9e3ceeab. +// +// Solidity: function setRequesterAccessController(address requesterAccessController) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetRequesterAccessController(requesterAccessController common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.SetRequesterAccessController(&_DualAggregator.TransactOpts, requesterAccessController) +} + +// SetValidatorConfig is a paid mutator transaction binding the contract method 0xeb457163. +// +// Solidity: function setValidatorConfig(address newValidator, uint32 newGasLimit) returns() +func (_DualAggregator *DualAggregatorTransactor) SetValidatorConfig(opts *bind.TransactOpts, newValidator common.Address, newGasLimit uint32) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "setValidatorConfig", newValidator, newGasLimit) +} + +// SetValidatorConfig is a paid mutator transaction binding the contract method 0xeb457163. +// +// Solidity: function setValidatorConfig(address newValidator, uint32 newGasLimit) returns() +func (_DualAggregator *DualAggregatorSession) SetValidatorConfig(newValidator common.Address, newGasLimit uint32) (*types.Transaction, error) { + return _DualAggregator.Contract.SetValidatorConfig(&_DualAggregator.TransactOpts, newValidator, newGasLimit) +} + +// SetValidatorConfig is a paid mutator transaction binding the contract method 0xeb457163. +// +// Solidity: function setValidatorConfig(address newValidator, uint32 newGasLimit) returns() +func (_DualAggregator *DualAggregatorTransactorSession) SetValidatorConfig(newValidator common.Address, newGasLimit uint32) (*types.Transaction, error) { + return _DualAggregator.Contract.SetValidatorConfig(&_DualAggregator.TransactOpts, newValidator, newGasLimit) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address to) returns() +func (_DualAggregator *DualAggregatorTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "transferOwnership", to) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address to) returns() +func (_DualAggregator *DualAggregatorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.TransferOwnership(&_DualAggregator.TransactOpts, to) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address to) returns() +func (_DualAggregator *DualAggregatorTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.TransferOwnership(&_DualAggregator.TransactOpts, to) +} + +// TransferPayeeship is a paid mutator transaction binding the contract method 0xeb5dcd6c. +// +// Solidity: function transferPayeeship(address transmitter, address proposed) returns() +func (_DualAggregator *DualAggregatorTransactor) TransferPayeeship(opts *bind.TransactOpts, transmitter common.Address, proposed common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "transferPayeeship", transmitter, proposed) +} + +// TransferPayeeship is a paid mutator transaction binding the contract method 0xeb5dcd6c. +// +// Solidity: function transferPayeeship(address transmitter, address proposed) returns() +func (_DualAggregator *DualAggregatorSession) TransferPayeeship(transmitter common.Address, proposed common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.TransferPayeeship(&_DualAggregator.TransactOpts, transmitter, proposed) +} + +// TransferPayeeship is a paid mutator transaction binding the contract method 0xeb5dcd6c. +// +// Solidity: function transferPayeeship(address transmitter, address proposed) returns() +func (_DualAggregator *DualAggregatorTransactorSession) TransferPayeeship(transmitter common.Address, proposed common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.TransferPayeeship(&_DualAggregator.TransactOpts, transmitter, proposed) +} + +// Transmit is a paid mutator transaction binding the contract method 0xb1dc65a4. +// +// Solidity: function transmit(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorTransactor) Transmit(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "transmit", reportContext, report, rs, ss, rawVs) +} + +// Transmit is a paid mutator transaction binding the contract method 0xb1dc65a4. +// +// Solidity: function transmit(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorSession) Transmit(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.Contract.Transmit(&_DualAggregator.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +// Transmit is a paid mutator transaction binding the contract method 0xb1dc65a4. +// +// Solidity: function transmit(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorTransactorSession) Transmit(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.Contract.Transmit(&_DualAggregator.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +// TransmitSecondary is a paid mutator transaction binding the contract method 0xba0cb29e. +// +// Solidity: function transmitSecondary(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorTransactor) TransmitSecondary(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "transmitSecondary", reportContext, report, rs, ss, rawVs) +} + +// TransmitSecondary is a paid mutator transaction binding the contract method 0xba0cb29e. +// +// Solidity: function transmitSecondary(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorSession) TransmitSecondary(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.Contract.TransmitSecondary(&_DualAggregator.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +// TransmitSecondary is a paid mutator transaction binding the contract method 0xba0cb29e. +// +// Solidity: function transmitSecondary(bytes32[3] reportContext, bytes report, bytes32[] rs, bytes32[] ss, bytes32 rawVs) returns() +func (_DualAggregator *DualAggregatorTransactorSession) TransmitSecondary(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _DualAggregator.Contract.TransmitSecondary(&_DualAggregator.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +// WithdrawFunds is a paid mutator transaction binding the contract method 0xc1075329. +// +// Solidity: function withdrawFunds(address recipient, uint256 amount) returns() +func (_DualAggregator *DualAggregatorTransactor) WithdrawFunds(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "withdrawFunds", recipient, amount) +} + +// WithdrawFunds is a paid mutator transaction binding the contract method 0xc1075329. +// +// Solidity: function withdrawFunds(address recipient, uint256 amount) returns() +func (_DualAggregator *DualAggregatorSession) WithdrawFunds(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _DualAggregator.Contract.WithdrawFunds(&_DualAggregator.TransactOpts, recipient, amount) +} + +// WithdrawFunds is a paid mutator transaction binding the contract method 0xc1075329. +// +// Solidity: function withdrawFunds(address recipient, uint256 amount) returns() +func (_DualAggregator *DualAggregatorTransactorSession) WithdrawFunds(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _DualAggregator.Contract.WithdrawFunds(&_DualAggregator.TransactOpts, recipient, amount) +} + +// WithdrawPayment is a paid mutator transaction binding the contract method 0x8ac28d5a. +// +// Solidity: function withdrawPayment(address transmitter) returns() +func (_DualAggregator *DualAggregatorTransactor) WithdrawPayment(opts *bind.TransactOpts, transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.contract.Transact(opts, "withdrawPayment", transmitter) +} + +// WithdrawPayment is a paid mutator transaction binding the contract method 0x8ac28d5a. +// +// Solidity: function withdrawPayment(address transmitter) returns() +func (_DualAggregator *DualAggregatorSession) WithdrawPayment(transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.WithdrawPayment(&_DualAggregator.TransactOpts, transmitter) +} + +// WithdrawPayment is a paid mutator transaction binding the contract method 0x8ac28d5a. +// +// Solidity: function withdrawPayment(address transmitter) returns() +func (_DualAggregator *DualAggregatorTransactorSession) WithdrawPayment(transmitter common.Address) (*types.Transaction, error) { + return _DualAggregator.Contract.WithdrawPayment(&_DualAggregator.TransactOpts, transmitter) +} + +// DualAggregatorAddedAccessIterator is returned from FilterAddedAccess and is used to iterate over the raw logs and unpacked data for AddedAccess events raised by the DualAggregator contract. +type DualAggregatorAddedAccessIterator struct { + Event *DualAggregatorAddedAccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorAddedAccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorAddedAccess) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorAddedAccess) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorAddedAccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorAddedAccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorAddedAccess represents a AddedAccess event raised by the DualAggregator contract. +type DualAggregatorAddedAccess struct { + User common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddedAccess is a free log retrieval operation binding the contract event 0x87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4. +// +// Solidity: event AddedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) FilterAddedAccess(opts *bind.FilterOpts) (*DualAggregatorAddedAccessIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "AddedAccess") + if err != nil { + return nil, err + } + return &DualAggregatorAddedAccessIterator{contract: _DualAggregator.contract, event: "AddedAccess", logs: logs, sub: sub}, nil +} + +// WatchAddedAccess is a free log subscription operation binding the contract event 0x87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4. +// +// Solidity: event AddedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) WatchAddedAccess(opts *bind.WatchOpts, sink chan<- *DualAggregatorAddedAccess) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "AddedAccess") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorAddedAccess) + if err := _DualAggregator.contract.UnpackLog(event, "AddedAccess", 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 +} + +// ParseAddedAccess is a log parse operation binding the contract event 0x87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db4. +// +// Solidity: event AddedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) ParseAddedAccess(log types.Log) (*DualAggregatorAddedAccess, error) { + event := new(DualAggregatorAddedAccess) + if err := _DualAggregator.contract.UnpackLog(event, "AddedAccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorAnswerUpdatedIterator is returned from FilterAnswerUpdated and is used to iterate over the raw logs and unpacked data for AnswerUpdated events raised by the DualAggregator contract. +type DualAggregatorAnswerUpdatedIterator struct { + Event *DualAggregatorAnswerUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorAnswerUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorAnswerUpdated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorAnswerUpdated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorAnswerUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorAnswerUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorAnswerUpdated represents a AnswerUpdated event raised by the DualAggregator contract. +type DualAggregatorAnswerUpdated struct { + Current *big.Int + RoundId *big.Int + UpdatedAt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAnswerUpdated is a free log retrieval operation binding the contract event 0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f. +// +// Solidity: event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt) +func (_DualAggregator *DualAggregatorFilterer) FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*DualAggregatorAnswerUpdatedIterator, error) { + + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "AnswerUpdated", currentRule, roundIdRule) + if err != nil { + return nil, err + } + return &DualAggregatorAnswerUpdatedIterator{contract: _DualAggregator.contract, event: "AnswerUpdated", logs: logs, sub: sub}, nil +} + +// WatchAnswerUpdated is a free log subscription operation binding the contract event 0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f. +// +// Solidity: event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt) +func (_DualAggregator *DualAggregatorFilterer) WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *DualAggregatorAnswerUpdated, current []*big.Int, roundId []*big.Int) (event.Subscription, error) { + + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "AnswerUpdated", currentRule, roundIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorAnswerUpdated) + if err := _DualAggregator.contract.UnpackLog(event, "AnswerUpdated", 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 +} + +// ParseAnswerUpdated is a log parse operation binding the contract event 0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f. +// +// Solidity: event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt) +func (_DualAggregator *DualAggregatorFilterer) ParseAnswerUpdated(log types.Log) (*DualAggregatorAnswerUpdated, error) { + event := new(DualAggregatorAnswerUpdated) + if err := _DualAggregator.contract.UnpackLog(event, "AnswerUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorBillingAccessControllerSetIterator is returned from FilterBillingAccessControllerSet and is used to iterate over the raw logs and unpacked data for BillingAccessControllerSet events raised by the DualAggregator contract. +type DualAggregatorBillingAccessControllerSetIterator struct { + Event *DualAggregatorBillingAccessControllerSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorBillingAccessControllerSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorBillingAccessControllerSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorBillingAccessControllerSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorBillingAccessControllerSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorBillingAccessControllerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorBillingAccessControllerSet represents a BillingAccessControllerSet event raised by the DualAggregator contract. +type DualAggregatorBillingAccessControllerSet struct { + Old common.Address + Current common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBillingAccessControllerSet is a free log retrieval operation binding the contract event 0x793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d48912. +// +// Solidity: event BillingAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) FilterBillingAccessControllerSet(opts *bind.FilterOpts) (*DualAggregatorBillingAccessControllerSetIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "BillingAccessControllerSet") + if err != nil { + return nil, err + } + return &DualAggregatorBillingAccessControllerSetIterator{contract: _DualAggregator.contract, event: "BillingAccessControllerSet", logs: logs, sub: sub}, nil +} + +// WatchBillingAccessControllerSet is a free log subscription operation binding the contract event 0x793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d48912. +// +// Solidity: event BillingAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) WatchBillingAccessControllerSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorBillingAccessControllerSet) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "BillingAccessControllerSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorBillingAccessControllerSet) + if err := _DualAggregator.contract.UnpackLog(event, "BillingAccessControllerSet", 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 +} + +// ParseBillingAccessControllerSet is a log parse operation binding the contract event 0x793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d48912. +// +// Solidity: event BillingAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) ParseBillingAccessControllerSet(log types.Log) (*DualAggregatorBillingAccessControllerSet, error) { + event := new(DualAggregatorBillingAccessControllerSet) + if err := _DualAggregator.contract.UnpackLog(event, "BillingAccessControllerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorBillingSetIterator is returned from FilterBillingSet and is used to iterate over the raw logs and unpacked data for BillingSet events raised by the DualAggregator contract. +type DualAggregatorBillingSetIterator struct { + Event *DualAggregatorBillingSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorBillingSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorBillingSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorBillingSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorBillingSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorBillingSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorBillingSet represents a BillingSet event raised by the DualAggregator contract. +type DualAggregatorBillingSet struct { + MaximumGasPriceGwei uint32 + ReasonableGasPriceGwei uint32 + ObservationPaymentGjuels uint32 + TransmissionPaymentGjuels uint32 + AccountingGas *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBillingSet is a free log retrieval operation binding the contract event 0x0bf184bf1bba9699114bdceddaf338a1b364252c5e497cc01918dde92031713f. +// +// Solidity: event BillingSet(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorFilterer) FilterBillingSet(opts *bind.FilterOpts) (*DualAggregatorBillingSetIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "BillingSet") + if err != nil { + return nil, err + } + return &DualAggregatorBillingSetIterator{contract: _DualAggregator.contract, event: "BillingSet", logs: logs, sub: sub}, nil +} + +// WatchBillingSet is a free log subscription operation binding the contract event 0x0bf184bf1bba9699114bdceddaf338a1b364252c5e497cc01918dde92031713f. +// +// Solidity: event BillingSet(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorFilterer) WatchBillingSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorBillingSet) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "BillingSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorBillingSet) + if err := _DualAggregator.contract.UnpackLog(event, "BillingSet", 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 +} + +// ParseBillingSet is a log parse operation binding the contract event 0x0bf184bf1bba9699114bdceddaf338a1b364252c5e497cc01918dde92031713f. +// +// Solidity: event BillingSet(uint32 maximumGasPriceGwei, uint32 reasonableGasPriceGwei, uint32 observationPaymentGjuels, uint32 transmissionPaymentGjuels, uint24 accountingGas) +func (_DualAggregator *DualAggregatorFilterer) ParseBillingSet(log types.Log) (*DualAggregatorBillingSet, error) { + event := new(DualAggregatorBillingSet) + if err := _DualAggregator.contract.UnpackLog(event, "BillingSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorCheckAccessDisabledIterator is returned from FilterCheckAccessDisabled and is used to iterate over the raw logs and unpacked data for CheckAccessDisabled events raised by the DualAggregator contract. +type DualAggregatorCheckAccessDisabledIterator struct { + Event *DualAggregatorCheckAccessDisabled // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorCheckAccessDisabledIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCheckAccessDisabled) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCheckAccessDisabled) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorCheckAccessDisabledIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorCheckAccessDisabledIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorCheckAccessDisabled represents a CheckAccessDisabled event raised by the DualAggregator contract. +type DualAggregatorCheckAccessDisabled struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckAccessDisabled is a free log retrieval operation binding the contract event 0x3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f539638. +// +// Solidity: event CheckAccessDisabled() +func (_DualAggregator *DualAggregatorFilterer) FilterCheckAccessDisabled(opts *bind.FilterOpts) (*DualAggregatorCheckAccessDisabledIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "CheckAccessDisabled") + if err != nil { + return nil, err + } + return &DualAggregatorCheckAccessDisabledIterator{contract: _DualAggregator.contract, event: "CheckAccessDisabled", logs: logs, sub: sub}, nil +} + +// WatchCheckAccessDisabled is a free log subscription operation binding the contract event 0x3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f539638. +// +// Solidity: event CheckAccessDisabled() +func (_DualAggregator *DualAggregatorFilterer) WatchCheckAccessDisabled(opts *bind.WatchOpts, sink chan<- *DualAggregatorCheckAccessDisabled) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "CheckAccessDisabled") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorCheckAccessDisabled) + if err := _DualAggregator.contract.UnpackLog(event, "CheckAccessDisabled", 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 +} + +// ParseCheckAccessDisabled is a log parse operation binding the contract event 0x3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f539638. +// +// Solidity: event CheckAccessDisabled() +func (_DualAggregator *DualAggregatorFilterer) ParseCheckAccessDisabled(log types.Log) (*DualAggregatorCheckAccessDisabled, error) { + event := new(DualAggregatorCheckAccessDisabled) + if err := _DualAggregator.contract.UnpackLog(event, "CheckAccessDisabled", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorCheckAccessEnabledIterator is returned from FilterCheckAccessEnabled and is used to iterate over the raw logs and unpacked data for CheckAccessEnabled events raised by the DualAggregator contract. +type DualAggregatorCheckAccessEnabledIterator struct { + Event *DualAggregatorCheckAccessEnabled // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorCheckAccessEnabledIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCheckAccessEnabled) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCheckAccessEnabled) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorCheckAccessEnabledIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorCheckAccessEnabledIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorCheckAccessEnabled represents a CheckAccessEnabled event raised by the DualAggregator contract. +type DualAggregatorCheckAccessEnabled struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckAccessEnabled is a free log retrieval operation binding the contract event 0xaebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c3480. +// +// Solidity: event CheckAccessEnabled() +func (_DualAggregator *DualAggregatorFilterer) FilterCheckAccessEnabled(opts *bind.FilterOpts) (*DualAggregatorCheckAccessEnabledIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "CheckAccessEnabled") + if err != nil { + return nil, err + } + return &DualAggregatorCheckAccessEnabledIterator{contract: _DualAggregator.contract, event: "CheckAccessEnabled", logs: logs, sub: sub}, nil +} + +// WatchCheckAccessEnabled is a free log subscription operation binding the contract event 0xaebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c3480. +// +// Solidity: event CheckAccessEnabled() +func (_DualAggregator *DualAggregatorFilterer) WatchCheckAccessEnabled(opts *bind.WatchOpts, sink chan<- *DualAggregatorCheckAccessEnabled) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "CheckAccessEnabled") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorCheckAccessEnabled) + if err := _DualAggregator.contract.UnpackLog(event, "CheckAccessEnabled", 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 +} + +// ParseCheckAccessEnabled is a log parse operation binding the contract event 0xaebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c3480. +// +// Solidity: event CheckAccessEnabled() +func (_DualAggregator *DualAggregatorFilterer) ParseCheckAccessEnabled(log types.Log) (*DualAggregatorCheckAccessEnabled, error) { + event := new(DualAggregatorCheckAccessEnabled) + if err := _DualAggregator.contract.UnpackLog(event, "CheckAccessEnabled", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorConfigSetIterator is returned from FilterConfigSet and is used to iterate over the raw logs and unpacked data for ConfigSet events raised by the DualAggregator contract. +type DualAggregatorConfigSetIterator struct { + Event *DualAggregatorConfigSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorConfigSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorConfigSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorConfigSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorConfigSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorConfigSet represents a ConfigSet event raised by the DualAggregator contract. +type DualAggregatorConfigSet struct { + PreviousConfigBlockNumber uint32 + ConfigDigest [32]byte + ConfigCount uint64 + Signers []common.Address + Transmitters []common.Address + F uint8 + OnchainConfig []byte + OffchainConfigVersion uint64 + OffchainConfig []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConfigSet is a free log retrieval operation binding the contract event 0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05. +// +// Solidity: event ConfigSet(uint32 previousConfigBlockNumber, bytes32 configDigest, uint64 configCount, address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) +func (_DualAggregator *DualAggregatorFilterer) FilterConfigSet(opts *bind.FilterOpts) (*DualAggregatorConfigSetIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return &DualAggregatorConfigSetIterator{contract: _DualAggregator.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +// WatchConfigSet is a free log subscription operation binding the contract event 0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05. +// +// Solidity: event ConfigSet(uint32 previousConfigBlockNumber, bytes32 configDigest, uint64 configCount, address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) +func (_DualAggregator *DualAggregatorFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorConfigSet) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorConfigSet) + if err := _DualAggregator.contract.UnpackLog(event, "ConfigSet", 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 +} + +// ParseConfigSet is a log parse operation binding the contract event 0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05. +// +// Solidity: event ConfigSet(uint32 previousConfigBlockNumber, bytes32 configDigest, uint64 configCount, address[] signers, address[] transmitters, uint8 f, bytes onchainConfig, uint64 offchainConfigVersion, bytes offchainConfig) +func (_DualAggregator *DualAggregatorFilterer) ParseConfigSet(log types.Log) (*DualAggregatorConfigSet, error) { + event := new(DualAggregatorConfigSet) + if err := _DualAggregator.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorCutoffTimeSetIterator is returned from FilterCutoffTimeSet and is used to iterate over the raw logs and unpacked data for CutoffTimeSet events raised by the DualAggregator contract. +type DualAggregatorCutoffTimeSetIterator struct { + Event *DualAggregatorCutoffTimeSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorCutoffTimeSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCutoffTimeSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorCutoffTimeSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorCutoffTimeSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorCutoffTimeSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorCutoffTimeSet represents a CutoffTimeSet event raised by the DualAggregator contract. +type DualAggregatorCutoffTimeSet struct { + CutoffTime uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCutoffTimeSet is a free log retrieval operation binding the contract event 0xb24a681ce3399a408a89fd0c2b59dfc24bdad592b1c7ec7671cf060596c1c4d1. +// +// Solidity: event CutoffTimeSet(uint32 cutoffTime) +func (_DualAggregator *DualAggregatorFilterer) FilterCutoffTimeSet(opts *bind.FilterOpts) (*DualAggregatorCutoffTimeSetIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "CutoffTimeSet") + if err != nil { + return nil, err + } + return &DualAggregatorCutoffTimeSetIterator{contract: _DualAggregator.contract, event: "CutoffTimeSet", logs: logs, sub: sub}, nil +} + +// WatchCutoffTimeSet is a free log subscription operation binding the contract event 0xb24a681ce3399a408a89fd0c2b59dfc24bdad592b1c7ec7671cf060596c1c4d1. +// +// Solidity: event CutoffTimeSet(uint32 cutoffTime) +func (_DualAggregator *DualAggregatorFilterer) WatchCutoffTimeSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorCutoffTimeSet) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "CutoffTimeSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorCutoffTimeSet) + if err := _DualAggregator.contract.UnpackLog(event, "CutoffTimeSet", 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 +} + +// ParseCutoffTimeSet is a log parse operation binding the contract event 0xb24a681ce3399a408a89fd0c2b59dfc24bdad592b1c7ec7671cf060596c1c4d1. +// +// Solidity: event CutoffTimeSet(uint32 cutoffTime) +func (_DualAggregator *DualAggregatorFilterer) ParseCutoffTimeSet(log types.Log) (*DualAggregatorCutoffTimeSet, error) { + event := new(DualAggregatorCutoffTimeSet) + if err := _DualAggregator.contract.UnpackLog(event, "CutoffTimeSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorLinkTokenSetIterator is returned from FilterLinkTokenSet and is used to iterate over the raw logs and unpacked data for LinkTokenSet events raised by the DualAggregator contract. +type DualAggregatorLinkTokenSetIterator struct { + Event *DualAggregatorLinkTokenSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorLinkTokenSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorLinkTokenSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorLinkTokenSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorLinkTokenSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorLinkTokenSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorLinkTokenSet represents a LinkTokenSet event raised by the DualAggregator contract. +type DualAggregatorLinkTokenSet struct { + OldLinkToken common.Address + NewLinkToken common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLinkTokenSet is a free log retrieval operation binding the contract event 0x4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a. +// +// Solidity: event LinkTokenSet(address indexed oldLinkToken, address indexed newLinkToken) +func (_DualAggregator *DualAggregatorFilterer) FilterLinkTokenSet(opts *bind.FilterOpts, oldLinkToken []common.Address, newLinkToken []common.Address) (*DualAggregatorLinkTokenSetIterator, error) { + + var oldLinkTokenRule []interface{} + for _, oldLinkTokenItem := range oldLinkToken { + oldLinkTokenRule = append(oldLinkTokenRule, oldLinkTokenItem) + } + var newLinkTokenRule []interface{} + for _, newLinkTokenItem := range newLinkToken { + newLinkTokenRule = append(newLinkTokenRule, newLinkTokenItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "LinkTokenSet", oldLinkTokenRule, newLinkTokenRule) + if err != nil { + return nil, err + } + return &DualAggregatorLinkTokenSetIterator{contract: _DualAggregator.contract, event: "LinkTokenSet", logs: logs, sub: sub}, nil +} + +// WatchLinkTokenSet is a free log subscription operation binding the contract event 0x4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a. +// +// Solidity: event LinkTokenSet(address indexed oldLinkToken, address indexed newLinkToken) +func (_DualAggregator *DualAggregatorFilterer) WatchLinkTokenSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorLinkTokenSet, oldLinkToken []common.Address, newLinkToken []common.Address) (event.Subscription, error) { + + var oldLinkTokenRule []interface{} + for _, oldLinkTokenItem := range oldLinkToken { + oldLinkTokenRule = append(oldLinkTokenRule, oldLinkTokenItem) + } + var newLinkTokenRule []interface{} + for _, newLinkTokenItem := range newLinkToken { + newLinkTokenRule = append(newLinkTokenRule, newLinkTokenItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "LinkTokenSet", oldLinkTokenRule, newLinkTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorLinkTokenSet) + if err := _DualAggregator.contract.UnpackLog(event, "LinkTokenSet", 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 +} + +// ParseLinkTokenSet is a log parse operation binding the contract event 0x4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a. +// +// Solidity: event LinkTokenSet(address indexed oldLinkToken, address indexed newLinkToken) +func (_DualAggregator *DualAggregatorFilterer) ParseLinkTokenSet(log types.Log) (*DualAggregatorLinkTokenSet, error) { + event := new(DualAggregatorLinkTokenSet) + if err := _DualAggregator.contract.UnpackLog(event, "LinkTokenSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorNewRoundIterator is returned from FilterNewRound and is used to iterate over the raw logs and unpacked data for NewRound events raised by the DualAggregator contract. +type DualAggregatorNewRoundIterator struct { + Event *DualAggregatorNewRound // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorNewRoundIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorNewRound) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorNewRound) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorNewRoundIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorNewRoundIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorNewRound represents a NewRound event raised by the DualAggregator contract. +type DualAggregatorNewRound struct { + RoundId *big.Int + StartedBy common.Address + StartedAt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewRound is a free log retrieval operation binding the contract event 0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271. +// +// Solidity: event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt) +func (_DualAggregator *DualAggregatorFilterer) FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*DualAggregatorNewRoundIterator, error) { + + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + var startedByRule []interface{} + for _, startedByItem := range startedBy { + startedByRule = append(startedByRule, startedByItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "NewRound", roundIdRule, startedByRule) + if err != nil { + return nil, err + } + return &DualAggregatorNewRoundIterator{contract: _DualAggregator.contract, event: "NewRound", logs: logs, sub: sub}, nil +} + +// WatchNewRound is a free log subscription operation binding the contract event 0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271. +// +// Solidity: event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt) +func (_DualAggregator *DualAggregatorFilterer) WatchNewRound(opts *bind.WatchOpts, sink chan<- *DualAggregatorNewRound, roundId []*big.Int, startedBy []common.Address) (event.Subscription, error) { + + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + var startedByRule []interface{} + for _, startedByItem := range startedBy { + startedByRule = append(startedByRule, startedByItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "NewRound", roundIdRule, startedByRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorNewRound) + if err := _DualAggregator.contract.UnpackLog(event, "NewRound", 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 +} + +// ParseNewRound is a log parse operation binding the contract event 0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271. +// +// Solidity: event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt) +func (_DualAggregator *DualAggregatorFilterer) ParseNewRound(log types.Log) (*DualAggregatorNewRound, error) { + event := new(DualAggregatorNewRound) + if err := _DualAggregator.contract.UnpackLog(event, "NewRound", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorNewTransmissionIterator is returned from FilterNewTransmission and is used to iterate over the raw logs and unpacked data for NewTransmission events raised by the DualAggregator contract. +type DualAggregatorNewTransmissionIterator struct { + Event *DualAggregatorNewTransmission // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorNewTransmissionIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorNewTransmission) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorNewTransmission) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorNewTransmissionIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorNewTransmissionIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorNewTransmission represents a NewTransmission event raised by the DualAggregator contract. +type DualAggregatorNewTransmission struct { + AggregatorRoundId uint32 + Answer *big.Int + Transmitter common.Address + ObservationsTimestamp uint32 + Observations []*big.Int + Observers []byte + JuelsPerFeeCoin *big.Int + ConfigDigest [32]byte + EpochAndRound *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewTransmission is a free log retrieval operation binding the contract event 0xc797025feeeaf2cd924c99e9205acb8ec04d5cad21c41ce637a38fb6dee6016a. +// +// Solidity: event NewTransmission(uint32 indexed aggregatorRoundId, int192 answer, address transmitter, uint32 observationsTimestamp, int192[] observations, bytes observers, int192 juelsPerFeeCoin, bytes32 configDigest, uint40 epochAndRound) +func (_DualAggregator *DualAggregatorFilterer) FilterNewTransmission(opts *bind.FilterOpts, aggregatorRoundId []uint32) (*DualAggregatorNewTransmissionIterator, error) { + + var aggregatorRoundIdRule []interface{} + for _, aggregatorRoundIdItem := range aggregatorRoundId { + aggregatorRoundIdRule = append(aggregatorRoundIdRule, aggregatorRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "NewTransmission", aggregatorRoundIdRule) + if err != nil { + return nil, err + } + return &DualAggregatorNewTransmissionIterator{contract: _DualAggregator.contract, event: "NewTransmission", logs: logs, sub: sub}, nil +} + +// WatchNewTransmission is a free log subscription operation binding the contract event 0xc797025feeeaf2cd924c99e9205acb8ec04d5cad21c41ce637a38fb6dee6016a. +// +// Solidity: event NewTransmission(uint32 indexed aggregatorRoundId, int192 answer, address transmitter, uint32 observationsTimestamp, int192[] observations, bytes observers, int192 juelsPerFeeCoin, bytes32 configDigest, uint40 epochAndRound) +func (_DualAggregator *DualAggregatorFilterer) WatchNewTransmission(opts *bind.WatchOpts, sink chan<- *DualAggregatorNewTransmission, aggregatorRoundId []uint32) (event.Subscription, error) { + + var aggregatorRoundIdRule []interface{} + for _, aggregatorRoundIdItem := range aggregatorRoundId { + aggregatorRoundIdRule = append(aggregatorRoundIdRule, aggregatorRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "NewTransmission", aggregatorRoundIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorNewTransmission) + if err := _DualAggregator.contract.UnpackLog(event, "NewTransmission", 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 +} + +// ParseNewTransmission is a log parse operation binding the contract event 0xc797025feeeaf2cd924c99e9205acb8ec04d5cad21c41ce637a38fb6dee6016a. +// +// Solidity: event NewTransmission(uint32 indexed aggregatorRoundId, int192 answer, address transmitter, uint32 observationsTimestamp, int192[] observations, bytes observers, int192 juelsPerFeeCoin, bytes32 configDigest, uint40 epochAndRound) +func (_DualAggregator *DualAggregatorFilterer) ParseNewTransmission(log types.Log) (*DualAggregatorNewTransmission, error) { + event := new(DualAggregatorNewTransmission) + if err := _DualAggregator.contract.UnpackLog(event, "NewTransmission", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorOraclePaidIterator is returned from FilterOraclePaid and is used to iterate over the raw logs and unpacked data for OraclePaid events raised by the DualAggregator contract. +type DualAggregatorOraclePaidIterator struct { + Event *DualAggregatorOraclePaid // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorOraclePaidIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOraclePaid) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOraclePaid) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorOraclePaidIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorOraclePaidIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorOraclePaid represents a OraclePaid event raised by the DualAggregator contract. +type DualAggregatorOraclePaid struct { + Transmitter common.Address + Payee common.Address + Amount *big.Int + LinkToken common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOraclePaid is a free log retrieval operation binding the contract event 0xd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c. +// +// Solidity: event OraclePaid(address indexed transmitter, address indexed payee, uint256 amount, address indexed linkToken) +func (_DualAggregator *DualAggregatorFilterer) FilterOraclePaid(opts *bind.FilterOpts, transmitter []common.Address, payee []common.Address, linkToken []common.Address) (*DualAggregatorOraclePaidIterator, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + var linkTokenRule []interface{} + for _, linkTokenItem := range linkToken { + linkTokenRule = append(linkTokenRule, linkTokenItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "OraclePaid", transmitterRule, payeeRule, linkTokenRule) + if err != nil { + return nil, err + } + return &DualAggregatorOraclePaidIterator{contract: _DualAggregator.contract, event: "OraclePaid", logs: logs, sub: sub}, nil +} + +// WatchOraclePaid is a free log subscription operation binding the contract event 0xd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c. +// +// Solidity: event OraclePaid(address indexed transmitter, address indexed payee, uint256 amount, address indexed linkToken) +func (_DualAggregator *DualAggregatorFilterer) WatchOraclePaid(opts *bind.WatchOpts, sink chan<- *DualAggregatorOraclePaid, transmitter []common.Address, payee []common.Address, linkToken []common.Address) (event.Subscription, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var payeeRule []interface{} + for _, payeeItem := range payee { + payeeRule = append(payeeRule, payeeItem) + } + + var linkTokenRule []interface{} + for _, linkTokenItem := range linkToken { + linkTokenRule = append(linkTokenRule, linkTokenItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "OraclePaid", transmitterRule, payeeRule, linkTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorOraclePaid) + if err := _DualAggregator.contract.UnpackLog(event, "OraclePaid", 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 +} + +// ParseOraclePaid is a log parse operation binding the contract event 0xd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c. +// +// Solidity: event OraclePaid(address indexed transmitter, address indexed payee, uint256 amount, address indexed linkToken) +func (_DualAggregator *DualAggregatorFilterer) ParseOraclePaid(log types.Log) (*DualAggregatorOraclePaid, error) { + event := new(DualAggregatorOraclePaid) + if err := _DualAggregator.contract.UnpackLog(event, "OraclePaid", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorOwnershipTransferRequestedIterator is returned from FilterOwnershipTransferRequested and is used to iterate over the raw logs and unpacked data for OwnershipTransferRequested events raised by the DualAggregator contract. +type DualAggregatorOwnershipTransferRequestedIterator struct { + Event *DualAggregatorOwnershipTransferRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorOwnershipTransferRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOwnershipTransferRequested) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOwnershipTransferRequested) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorOwnershipTransferRequested represents a OwnershipTransferRequested event raised by the DualAggregator contract. +type DualAggregatorOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferRequested is a free log retrieval operation binding the contract event 0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278. +// +// Solidity: event OwnershipTransferRequested(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DualAggregatorOwnershipTransferRequestedIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &DualAggregatorOwnershipTransferRequestedIterator{contract: _DualAggregator.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferRequested is a free log subscription operation binding the contract event 0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278. +// +// Solidity: event OwnershipTransferRequested(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *DualAggregatorOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorOwnershipTransferRequested) + if err := _DualAggregator.contract.UnpackLog(event, "OwnershipTransferRequested", 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 +} + +// ParseOwnershipTransferRequested is a log parse operation binding the contract event 0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278. +// +// Solidity: event OwnershipTransferRequested(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) ParseOwnershipTransferRequested(log types.Log) (*DualAggregatorOwnershipTransferRequested, error) { + event := new(DualAggregatorOwnershipTransferRequested) + if err := _DualAggregator.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DualAggregator contract. +type DualAggregatorOwnershipTransferredIterator struct { + Event *DualAggregatorOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOwnershipTransferred) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorOwnershipTransferred) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorOwnershipTransferred represents a OwnershipTransferred event raised by the DualAggregator contract. +type DualAggregatorOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DualAggregatorOwnershipTransferredIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &DualAggregatorOwnershipTransferredIterator{contract: _DualAggregator.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DualAggregatorOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorOwnershipTransferred) + if err := _DualAggregator.contract.UnpackLog(event, "OwnershipTransferred", 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 +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed from, address indexed to) +func (_DualAggregator *DualAggregatorFilterer) ParseOwnershipTransferred(log types.Log) (*DualAggregatorOwnershipTransferred, error) { + event := new(DualAggregatorOwnershipTransferred) + if err := _DualAggregator.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorPayeeshipTransferRequestedIterator is returned from FilterPayeeshipTransferRequested and is used to iterate over the raw logs and unpacked data for PayeeshipTransferRequested events raised by the DualAggregator contract. +type DualAggregatorPayeeshipTransferRequestedIterator struct { + Event *DualAggregatorPayeeshipTransferRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorPayeeshipTransferRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPayeeshipTransferRequested) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPayeeshipTransferRequested) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorPayeeshipTransferRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorPayeeshipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorPayeeshipTransferRequested represents a PayeeshipTransferRequested event raised by the DualAggregator contract. +type DualAggregatorPayeeshipTransferRequested struct { + Transmitter common.Address + Current common.Address + Proposed common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPayeeshipTransferRequested is a free log retrieval operation binding the contract event 0x84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e38367. +// +// Solidity: event PayeeshipTransferRequested(address indexed transmitter, address indexed current, address indexed proposed) +func (_DualAggregator *DualAggregatorFilterer) FilterPayeeshipTransferRequested(opts *bind.FilterOpts, transmitter []common.Address, current []common.Address, proposed []common.Address) (*DualAggregatorPayeeshipTransferRequestedIterator, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + var proposedRule []interface{} + for _, proposedItem := range proposed { + proposedRule = append(proposedRule, proposedItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "PayeeshipTransferRequested", transmitterRule, currentRule, proposedRule) + if err != nil { + return nil, err + } + return &DualAggregatorPayeeshipTransferRequestedIterator{contract: _DualAggregator.contract, event: "PayeeshipTransferRequested", logs: logs, sub: sub}, nil +} + +// WatchPayeeshipTransferRequested is a free log subscription operation binding the contract event 0x84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e38367. +// +// Solidity: event PayeeshipTransferRequested(address indexed transmitter, address indexed current, address indexed proposed) +func (_DualAggregator *DualAggregatorFilterer) WatchPayeeshipTransferRequested(opts *bind.WatchOpts, sink chan<- *DualAggregatorPayeeshipTransferRequested, transmitter []common.Address, current []common.Address, proposed []common.Address) (event.Subscription, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + var proposedRule []interface{} + for _, proposedItem := range proposed { + proposedRule = append(proposedRule, proposedItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "PayeeshipTransferRequested", transmitterRule, currentRule, proposedRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorPayeeshipTransferRequested) + if err := _DualAggregator.contract.UnpackLog(event, "PayeeshipTransferRequested", 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 +} + +// ParsePayeeshipTransferRequested is a log parse operation binding the contract event 0x84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e38367. +// +// Solidity: event PayeeshipTransferRequested(address indexed transmitter, address indexed current, address indexed proposed) +func (_DualAggregator *DualAggregatorFilterer) ParsePayeeshipTransferRequested(log types.Log) (*DualAggregatorPayeeshipTransferRequested, error) { + event := new(DualAggregatorPayeeshipTransferRequested) + if err := _DualAggregator.contract.UnpackLog(event, "PayeeshipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorPayeeshipTransferredIterator is returned from FilterPayeeshipTransferred and is used to iterate over the raw logs and unpacked data for PayeeshipTransferred events raised by the DualAggregator contract. +type DualAggregatorPayeeshipTransferredIterator struct { + Event *DualAggregatorPayeeshipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorPayeeshipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPayeeshipTransferred) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPayeeshipTransferred) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorPayeeshipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorPayeeshipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorPayeeshipTransferred represents a PayeeshipTransferred event raised by the DualAggregator contract. +type DualAggregatorPayeeshipTransferred struct { + Transmitter common.Address + Previous common.Address + Current common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPayeeshipTransferred is a free log retrieval operation binding the contract event 0x78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b3. +// +// Solidity: event PayeeshipTransferred(address indexed transmitter, address indexed previous, address indexed current) +func (_DualAggregator *DualAggregatorFilterer) FilterPayeeshipTransferred(opts *bind.FilterOpts, transmitter []common.Address, previous []common.Address, current []common.Address) (*DualAggregatorPayeeshipTransferredIterator, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var previousRule []interface{} + for _, previousItem := range previous { + previousRule = append(previousRule, previousItem) + } + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "PayeeshipTransferred", transmitterRule, previousRule, currentRule) + if err != nil { + return nil, err + } + return &DualAggregatorPayeeshipTransferredIterator{contract: _DualAggregator.contract, event: "PayeeshipTransferred", logs: logs, sub: sub}, nil +} + +// WatchPayeeshipTransferred is a free log subscription operation binding the contract event 0x78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b3. +// +// Solidity: event PayeeshipTransferred(address indexed transmitter, address indexed previous, address indexed current) +func (_DualAggregator *DualAggregatorFilterer) WatchPayeeshipTransferred(opts *bind.WatchOpts, sink chan<- *DualAggregatorPayeeshipTransferred, transmitter []common.Address, previous []common.Address, current []common.Address) (event.Subscription, error) { + + var transmitterRule []interface{} + for _, transmitterItem := range transmitter { + transmitterRule = append(transmitterRule, transmitterItem) + } + var previousRule []interface{} + for _, previousItem := range previous { + previousRule = append(previousRule, previousItem) + } + var currentRule []interface{} + for _, currentItem := range current { + currentRule = append(currentRule, currentItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "PayeeshipTransferred", transmitterRule, previousRule, currentRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorPayeeshipTransferred) + if err := _DualAggregator.contract.UnpackLog(event, "PayeeshipTransferred", 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 +} + +// ParsePayeeshipTransferred is a log parse operation binding the contract event 0x78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b3. +// +// Solidity: event PayeeshipTransferred(address indexed transmitter, address indexed previous, address indexed current) +func (_DualAggregator *DualAggregatorFilterer) ParsePayeeshipTransferred(log types.Log) (*DualAggregatorPayeeshipTransferred, error) { + event := new(DualAggregatorPayeeshipTransferred) + if err := _DualAggregator.contract.UnpackLog(event, "PayeeshipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorPrimaryFeedUnlockedIterator is returned from FilterPrimaryFeedUnlocked and is used to iterate over the raw logs and unpacked data for PrimaryFeedUnlocked events raised by the DualAggregator contract. +type DualAggregatorPrimaryFeedUnlockedIterator struct { + Event *DualAggregatorPrimaryFeedUnlocked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorPrimaryFeedUnlockedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPrimaryFeedUnlocked) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorPrimaryFeedUnlocked) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorPrimaryFeedUnlockedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorPrimaryFeedUnlockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorPrimaryFeedUnlocked represents a PrimaryFeedUnlocked event raised by the DualAggregator contract. +type DualAggregatorPrimaryFeedUnlocked struct { + PrimaryRoundId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPrimaryFeedUnlocked is a free log retrieval operation binding the contract event 0xda2435684a37fba6f7841e49b59e6ad975e462bbebd28ec9da4ed9746a6992be. +// +// Solidity: event PrimaryFeedUnlocked(uint32 indexed primaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) FilterPrimaryFeedUnlocked(opts *bind.FilterOpts, primaryRoundId []uint32) (*DualAggregatorPrimaryFeedUnlockedIterator, error) { + + var primaryRoundIdRule []interface{} + for _, primaryRoundIdItem := range primaryRoundId { + primaryRoundIdRule = append(primaryRoundIdRule, primaryRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "PrimaryFeedUnlocked", primaryRoundIdRule) + if err != nil { + return nil, err + } + return &DualAggregatorPrimaryFeedUnlockedIterator{contract: _DualAggregator.contract, event: "PrimaryFeedUnlocked", logs: logs, sub: sub}, nil +} + +// WatchPrimaryFeedUnlocked is a free log subscription operation binding the contract event 0xda2435684a37fba6f7841e49b59e6ad975e462bbebd28ec9da4ed9746a6992be. +// +// Solidity: event PrimaryFeedUnlocked(uint32 indexed primaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) WatchPrimaryFeedUnlocked(opts *bind.WatchOpts, sink chan<- *DualAggregatorPrimaryFeedUnlocked, primaryRoundId []uint32) (event.Subscription, error) { + + var primaryRoundIdRule []interface{} + for _, primaryRoundIdItem := range primaryRoundId { + primaryRoundIdRule = append(primaryRoundIdRule, primaryRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "PrimaryFeedUnlocked", primaryRoundIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorPrimaryFeedUnlocked) + if err := _DualAggregator.contract.UnpackLog(event, "PrimaryFeedUnlocked", 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 +} + +// ParsePrimaryFeedUnlocked is a log parse operation binding the contract event 0xda2435684a37fba6f7841e49b59e6ad975e462bbebd28ec9da4ed9746a6992be. +// +// Solidity: event PrimaryFeedUnlocked(uint32 indexed primaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) ParsePrimaryFeedUnlocked(log types.Log) (*DualAggregatorPrimaryFeedUnlocked, error) { + event := new(DualAggregatorPrimaryFeedUnlocked) + if err := _DualAggregator.contract.UnpackLog(event, "PrimaryFeedUnlocked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorRemovedAccessIterator is returned from FilterRemovedAccess and is used to iterate over the raw logs and unpacked data for RemovedAccess events raised by the DualAggregator contract. +type DualAggregatorRemovedAccessIterator struct { + Event *DualAggregatorRemovedAccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorRemovedAccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRemovedAccess) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRemovedAccess) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorRemovedAccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorRemovedAccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorRemovedAccess represents a RemovedAccess event raised by the DualAggregator contract. +type DualAggregatorRemovedAccess struct { + User common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemovedAccess is a free log retrieval operation binding the contract event 0x3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1. +// +// Solidity: event RemovedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) FilterRemovedAccess(opts *bind.FilterOpts) (*DualAggregatorRemovedAccessIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "RemovedAccess") + if err != nil { + return nil, err + } + return &DualAggregatorRemovedAccessIterator{contract: _DualAggregator.contract, event: "RemovedAccess", logs: logs, sub: sub}, nil +} + +// WatchRemovedAccess is a free log subscription operation binding the contract event 0x3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1. +// +// Solidity: event RemovedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) WatchRemovedAccess(opts *bind.WatchOpts, sink chan<- *DualAggregatorRemovedAccess) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "RemovedAccess") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorRemovedAccess) + if err := _DualAggregator.contract.UnpackLog(event, "RemovedAccess", 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 +} + +// ParseRemovedAccess is a log parse operation binding the contract event 0x3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d1. +// +// Solidity: event RemovedAccess(address user) +func (_DualAggregator *DualAggregatorFilterer) ParseRemovedAccess(log types.Log) (*DualAggregatorRemovedAccess, error) { + event := new(DualAggregatorRemovedAccess) + if err := _DualAggregator.contract.UnpackLog(event, "RemovedAccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorRequesterAccessControllerSetIterator is returned from FilterRequesterAccessControllerSet and is used to iterate over the raw logs and unpacked data for RequesterAccessControllerSet events raised by the DualAggregator contract. +type DualAggregatorRequesterAccessControllerSetIterator struct { + Event *DualAggregatorRequesterAccessControllerSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorRequesterAccessControllerSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRequesterAccessControllerSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRequesterAccessControllerSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorRequesterAccessControllerSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorRequesterAccessControllerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorRequesterAccessControllerSet represents a RequesterAccessControllerSet event raised by the DualAggregator contract. +type DualAggregatorRequesterAccessControllerSet struct { + Old common.Address + Current common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRequesterAccessControllerSet is a free log retrieval operation binding the contract event 0x27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae634. +// +// Solidity: event RequesterAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) FilterRequesterAccessControllerSet(opts *bind.FilterOpts) (*DualAggregatorRequesterAccessControllerSetIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "RequesterAccessControllerSet") + if err != nil { + return nil, err + } + return &DualAggregatorRequesterAccessControllerSetIterator{contract: _DualAggregator.contract, event: "RequesterAccessControllerSet", logs: logs, sub: sub}, nil +} + +// WatchRequesterAccessControllerSet is a free log subscription operation binding the contract event 0x27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae634. +// +// Solidity: event RequesterAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) WatchRequesterAccessControllerSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorRequesterAccessControllerSet) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "RequesterAccessControllerSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorRequesterAccessControllerSet) + if err := _DualAggregator.contract.UnpackLog(event, "RequesterAccessControllerSet", 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 +} + +// ParseRequesterAccessControllerSet is a log parse operation binding the contract event 0x27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae634. +// +// Solidity: event RequesterAccessControllerSet(address old, address current) +func (_DualAggregator *DualAggregatorFilterer) ParseRequesterAccessControllerSet(log types.Log) (*DualAggregatorRequesterAccessControllerSet, error) { + event := new(DualAggregatorRequesterAccessControllerSet) + if err := _DualAggregator.contract.UnpackLog(event, "RequesterAccessControllerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorRoundRequestedIterator is returned from FilterRoundRequested and is used to iterate over the raw logs and unpacked data for RoundRequested events raised by the DualAggregator contract. +type DualAggregatorRoundRequestedIterator struct { + Event *DualAggregatorRoundRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorRoundRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRoundRequested) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorRoundRequested) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorRoundRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorRoundRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorRoundRequested represents a RoundRequested event raised by the DualAggregator contract. +type DualAggregatorRoundRequested struct { + Requester common.Address + ConfigDigest [32]byte + Epoch uint32 + Round uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoundRequested is a free log retrieval operation binding the contract event 0x41e3990591fd372502daa15842da15bc7f41c75309ab3ff4f56f1848c178825c. +// +// Solidity: event RoundRequested(address indexed requester, bytes32 configDigest, uint32 epoch, uint8 round) +func (_DualAggregator *DualAggregatorFilterer) FilterRoundRequested(opts *bind.FilterOpts, requester []common.Address) (*DualAggregatorRoundRequestedIterator, error) { + + var requesterRule []interface{} + for _, requesterItem := range requester { + requesterRule = append(requesterRule, requesterItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "RoundRequested", requesterRule) + if err != nil { + return nil, err + } + return &DualAggregatorRoundRequestedIterator{contract: _DualAggregator.contract, event: "RoundRequested", logs: logs, sub: sub}, nil +} + +// WatchRoundRequested is a free log subscription operation binding the contract event 0x41e3990591fd372502daa15842da15bc7f41c75309ab3ff4f56f1848c178825c. +// +// Solidity: event RoundRequested(address indexed requester, bytes32 configDigest, uint32 epoch, uint8 round) +func (_DualAggregator *DualAggregatorFilterer) WatchRoundRequested(opts *bind.WatchOpts, sink chan<- *DualAggregatorRoundRequested, requester []common.Address) (event.Subscription, error) { + + var requesterRule []interface{} + for _, requesterItem := range requester { + requesterRule = append(requesterRule, requesterItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "RoundRequested", requesterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorRoundRequested) + if err := _DualAggregator.contract.UnpackLog(event, "RoundRequested", 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 +} + +// ParseRoundRequested is a log parse operation binding the contract event 0x41e3990591fd372502daa15842da15bc7f41c75309ab3ff4f56f1848c178825c. +// +// Solidity: event RoundRequested(address indexed requester, bytes32 configDigest, uint32 epoch, uint8 round) +func (_DualAggregator *DualAggregatorFilterer) ParseRoundRequested(log types.Log) (*DualAggregatorRoundRequested, error) { + event := new(DualAggregatorRoundRequested) + if err := _DualAggregator.contract.UnpackLog(event, "RoundRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorSecondaryRoundIdUpdatedIterator is returned from FilterSecondaryRoundIdUpdated and is used to iterate over the raw logs and unpacked data for SecondaryRoundIdUpdated events raised by the DualAggregator contract. +type DualAggregatorSecondaryRoundIdUpdatedIterator struct { + Event *DualAggregatorSecondaryRoundIdUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorSecondaryRoundIdUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorSecondaryRoundIdUpdated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorSecondaryRoundIdUpdated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorSecondaryRoundIdUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorSecondaryRoundIdUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorSecondaryRoundIdUpdated represents a SecondaryRoundIdUpdated event raised by the DualAggregator contract. +type DualAggregatorSecondaryRoundIdUpdated struct { + SecondaryRoundId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSecondaryRoundIdUpdated is a free log retrieval operation binding the contract event 0x8d530b9ddc4b318d28fdd4c3a21fcfecece54c1a72a824f262985b99afef009b. +// +// Solidity: event SecondaryRoundIdUpdated(uint32 indexed secondaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) FilterSecondaryRoundIdUpdated(opts *bind.FilterOpts, secondaryRoundId []uint32) (*DualAggregatorSecondaryRoundIdUpdatedIterator, error) { + + var secondaryRoundIdRule []interface{} + for _, secondaryRoundIdItem := range secondaryRoundId { + secondaryRoundIdRule = append(secondaryRoundIdRule, secondaryRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "SecondaryRoundIdUpdated", secondaryRoundIdRule) + if err != nil { + return nil, err + } + return &DualAggregatorSecondaryRoundIdUpdatedIterator{contract: _DualAggregator.contract, event: "SecondaryRoundIdUpdated", logs: logs, sub: sub}, nil +} + +// WatchSecondaryRoundIdUpdated is a free log subscription operation binding the contract event 0x8d530b9ddc4b318d28fdd4c3a21fcfecece54c1a72a824f262985b99afef009b. +// +// Solidity: event SecondaryRoundIdUpdated(uint32 indexed secondaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) WatchSecondaryRoundIdUpdated(opts *bind.WatchOpts, sink chan<- *DualAggregatorSecondaryRoundIdUpdated, secondaryRoundId []uint32) (event.Subscription, error) { + + var secondaryRoundIdRule []interface{} + for _, secondaryRoundIdItem := range secondaryRoundId { + secondaryRoundIdRule = append(secondaryRoundIdRule, secondaryRoundIdItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "SecondaryRoundIdUpdated", secondaryRoundIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorSecondaryRoundIdUpdated) + if err := _DualAggregator.contract.UnpackLog(event, "SecondaryRoundIdUpdated", 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 +} + +// ParseSecondaryRoundIdUpdated is a log parse operation binding the contract event 0x8d530b9ddc4b318d28fdd4c3a21fcfecece54c1a72a824f262985b99afef009b. +// +// Solidity: event SecondaryRoundIdUpdated(uint32 indexed secondaryRoundId) +func (_DualAggregator *DualAggregatorFilterer) ParseSecondaryRoundIdUpdated(log types.Log) (*DualAggregatorSecondaryRoundIdUpdated, error) { + event := new(DualAggregatorSecondaryRoundIdUpdated) + if err := _DualAggregator.contract.UnpackLog(event, "SecondaryRoundIdUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorTransmittedIterator is returned from FilterTransmitted and is used to iterate over the raw logs and unpacked data for Transmitted events raised by the DualAggregator contract. +type DualAggregatorTransmittedIterator struct { + Event *DualAggregatorTransmitted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorTransmittedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorTransmitted) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorTransmitted) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorTransmittedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorTransmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorTransmitted represents a Transmitted event raised by the DualAggregator contract. +type DualAggregatorTransmitted struct { + ConfigDigest [32]byte + Epoch uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransmitted is a free log retrieval operation binding the contract event 0xb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62. +// +// Solidity: event Transmitted(bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorFilterer) FilterTransmitted(opts *bind.FilterOpts) (*DualAggregatorTransmittedIterator, error) { + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "Transmitted") + if err != nil { + return nil, err + } + return &DualAggregatorTransmittedIterator{contract: _DualAggregator.contract, event: "Transmitted", logs: logs, sub: sub}, nil +} + +// WatchTransmitted is a free log subscription operation binding the contract event 0xb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62. +// +// Solidity: event Transmitted(bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *DualAggregatorTransmitted) (event.Subscription, error) { + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "Transmitted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorTransmitted) + if err := _DualAggregator.contract.UnpackLog(event, "Transmitted", 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 +} + +// ParseTransmitted is a log parse operation binding the contract event 0xb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62. +// +// Solidity: event Transmitted(bytes32 configDigest, uint32 epoch) +func (_DualAggregator *DualAggregatorFilterer) ParseTransmitted(log types.Log) (*DualAggregatorTransmitted, error) { + event := new(DualAggregatorTransmitted) + if err := _DualAggregator.contract.UnpackLog(event, "Transmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// DualAggregatorValidatorConfigSetIterator is returned from FilterValidatorConfigSet and is used to iterate over the raw logs and unpacked data for ValidatorConfigSet events raised by the DualAggregator contract. +type DualAggregatorValidatorConfigSetIterator struct { + Event *DualAggregatorValidatorConfigSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *DualAggregatorValidatorConfigSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(DualAggregatorValidatorConfigSet) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(DualAggregatorValidatorConfigSet) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *DualAggregatorValidatorConfigSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *DualAggregatorValidatorConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// DualAggregatorValidatorConfigSet represents a ValidatorConfigSet event raised by the DualAggregator contract. +type DualAggregatorValidatorConfigSet struct { + PreviousValidator common.Address + PreviousGasLimit uint32 + CurrentValidator common.Address + CurrentGasLimit uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorConfigSet is a free log retrieval operation binding the contract event 0xb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541. +// +// Solidity: event ValidatorConfigSet(address indexed previousValidator, uint32 previousGasLimit, address indexed currentValidator, uint32 currentGasLimit) +func (_DualAggregator *DualAggregatorFilterer) FilterValidatorConfigSet(opts *bind.FilterOpts, previousValidator []common.Address, currentValidator []common.Address) (*DualAggregatorValidatorConfigSetIterator, error) { + + var previousValidatorRule []interface{} + for _, previousValidatorItem := range previousValidator { + previousValidatorRule = append(previousValidatorRule, previousValidatorItem) + } + + var currentValidatorRule []interface{} + for _, currentValidatorItem := range currentValidator { + currentValidatorRule = append(currentValidatorRule, currentValidatorItem) + } + + logs, sub, err := _DualAggregator.contract.FilterLogs(opts, "ValidatorConfigSet", previousValidatorRule, currentValidatorRule) + if err != nil { + return nil, err + } + return &DualAggregatorValidatorConfigSetIterator{contract: _DualAggregator.contract, event: "ValidatorConfigSet", logs: logs, sub: sub}, nil +} + +// WatchValidatorConfigSet is a free log subscription operation binding the contract event 0xb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541. +// +// Solidity: event ValidatorConfigSet(address indexed previousValidator, uint32 previousGasLimit, address indexed currentValidator, uint32 currentGasLimit) +func (_DualAggregator *DualAggregatorFilterer) WatchValidatorConfigSet(opts *bind.WatchOpts, sink chan<- *DualAggregatorValidatorConfigSet, previousValidator []common.Address, currentValidator []common.Address) (event.Subscription, error) { + + var previousValidatorRule []interface{} + for _, previousValidatorItem := range previousValidator { + previousValidatorRule = append(previousValidatorRule, previousValidatorItem) + } + + var currentValidatorRule []interface{} + for _, currentValidatorItem := range currentValidator { + currentValidatorRule = append(currentValidatorRule, currentValidatorItem) + } + + logs, sub, err := _DualAggregator.contract.WatchLogs(opts, "ValidatorConfigSet", previousValidatorRule, currentValidatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(DualAggregatorValidatorConfigSet) + if err := _DualAggregator.contract.UnpackLog(event, "ValidatorConfigSet", 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 +} + +// ParseValidatorConfigSet is a log parse operation binding the contract event 0xb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541. +// +// Solidity: event ValidatorConfigSet(address indexed previousValidator, uint32 previousGasLimit, address indexed currentValidator, uint32 currentGasLimit) +func (_DualAggregator *DualAggregatorFilterer) ParseValidatorConfigSet(log types.Log) (*DualAggregatorValidatorConfigSet, error) { + event := new(DualAggregatorValidatorConfigSet) + if err := _DualAggregator.contract.UnpackLog(event, "ValidatorConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/deployment/environment/nodeclient/chainlink.go b/deployment/environment/nodeclient/chainlink.go index 9b92dd12759..b4a49b8fc48 100644 --- a/deployment/environment/nodeclient/chainlink.go +++ b/deployment/environment/nodeclient/chainlink.go @@ -3,6 +3,7 @@ package nodeclient import ( "crypto/tls" + "errors" "fmt" "math/big" "net/http" @@ -36,12 +37,13 @@ var ( ) type ChainlinkClient struct { - APIClient *resty.Client - Config *ChainlinkConfig - pageSize int - primaryEthAddress string - ethAddresses []string - l zerolog.Logger + APIClient *resty.Client + Config *ChainlinkConfig + pageSize int + primaryEthAddress string + secondaryEthAddress string + ethAddresses []string + l zerolog.Logger } // NewChainlinkClient creates a new Chainlink model using a provided config @@ -578,6 +580,21 @@ func (c *ChainlinkClient) PrimaryEthAddress() (string, error) { return c.primaryEthAddress, nil } +// SecondaryEthAddress returns the second ETH address for the Chainlink node +func (c *ChainlinkClient) SecondaryEthAddress() (string, error) { + if c.secondaryEthAddress == "" { + ethKeys, err := c.MustReadETHKeys() + if err != nil { + return "", err + } + if len(ethKeys.Data) <= 1 { + return "", errors.New("node does not have secondary address") + } + c.secondaryEthAddress = ethKeys.Data[1].Attributes.Address + } + return c.secondaryEthAddress, nil +} + // EthAddresses returns the ETH addresses for the Chainlink node func (c *ChainlinkClient) EthAddresses() ([]string, error) { if len(c.ethAddresses) == 0 { diff --git a/integration-tests/actions/deployment_dual_aggregator.go b/integration-tests/actions/deployment_dual_aggregator.go new file mode 100644 index 00000000000..d232ef45c3c --- /dev/null +++ b/integration-tests/actions/deployment_dual_aggregator.go @@ -0,0 +1,54 @@ +package actions + +import ( + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/integration-tests/contracts" + gethwrappers "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/dual-transmission" +) + +type Input struct { + URL string `toml:"url"` + Out *Output `toml:"out"` +} + +type Output struct { + UseCache bool `toml:"use_cache"` + Addresses []common.Address `toml:"addresses"` +} + +func NewDualAggregatorDeployment(c *seth.Client, in *Input, linkContractAddress string, offchainOptions contracts.OffchainOptions) (*Output, error) { + if in.Out != nil && in.Out.UseCache { + return in.Out, nil + } + abi, err := gethwrappers.DualAggregatorMetaData.GetAbi() + if err != nil { + return nil, err + } + dd, err := c.DeployContract(c.NewTXOpts(), + "DualAggregator", + *abi, + common.FromHex(gethwrappers.DualAggregatorMetaData.Bin), + common.HexToAddress(linkContractAddress), + offchainOptions.MinimumAnswer, + offchainOptions.MaximumAnswer, + offchainOptions.BillingAccessController, // billingAccessController + offchainOptions.RequesterAccessController, // requesterAccessController + offchainOptions.Decimals, + offchainOptions.Description, + "0x0000000000000000000000000000000000000000", // secondary proxy + 30, // cutOffTime + 20, // maxSyncIterations + ) + if err != nil { + return nil, err + } + out := &Output{ + UseCache: true, + // save all the addresses to output, so it can be cached + Addresses: []common.Address{dd.Address}, + } + in.Out = out + return out, nil +} diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 3c31f638226..d537f5cee8f 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -39,6 +39,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20241118091009-43c2b4804cec github.com/smartcontractkit/chainlink-common v0.3.1-0.20241114134822-aadff98ef068 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.7 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.14 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 @@ -129,8 +130,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect - github.com/bytedance/sonic v1.11.6 // indirect - github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect @@ -201,7 +202,7 @@ require ( github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gagliardetto/binary v0.7.7 // indirect github.com/gagliardetto/solana-go v1.8.4 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -231,12 +232,12 @@ require ( github.com/go-openapi/validate v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.0 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-viper/mapstructure/v2 v2.1.0 // indirect github.com/go-webauthn/webauthn v0.9.4 // indirect github.com/go-webauthn/x v0.1.5 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-yaml v1.12.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -328,7 +329,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect @@ -343,7 +344,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -396,7 +397,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/prometheus v0.54.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.10.1 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index a8806992121..7c537745dc0 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -234,6 +234,8 @@ github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQ github.com/aws/jsii-runtime-go v1.104.0/go.mod h1:7ZmQXxV0AAhhvv/GaHX4n6zbgA1tSRVdnQYAJbIhXHk= github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= @@ -274,10 +276,11 @@ github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40 github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8wXTj/mYJSG6Q4yu3Pw= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0/go.mod h1:5YIL+Ouiww2zpO7u+iZ1U1G5NvmwQYaXdmCZQGjQM0U= -github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= -github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= -github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= @@ -418,8 +421,8 @@ github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJF github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= @@ -523,8 +526,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= @@ -609,8 +612,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= -github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= @@ -632,8 +635,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0= github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -1025,8 +1028,8 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -1101,8 +1104,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1183,8 +1186,8 @@ github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.12.0 h1:KuQRUE3PgxRFWhq4gHvZtPSLCGDqM5q/cYr1pZ39ytc= -github.com/muesli/termenv v0.12.0/go.mod h1:WCCv32tusQ/EEZ5S8oUIIrC/nIuBcxCVqlN4Xfkv+7A= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1327,8 +1330,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1421,6 +1424,8 @@ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241115191142-8b8369c1f44 github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241115191142-8b8369c1f44e/go.mod h1:mGmRvlk54ufCufV4EBWizOGtXoXfePoFAuYEVC8EwdY= github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241017135645-176a23722fd8 h1:B4DFdk6MGcQnoCjjMBCx7Z+GWQpxRWJ4O8W/dVJyWGA= github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241017135645-176a23722fd8/go.mod h1:WkBqgBo+g34Gm5vWkDDl8Fh3Mzd7bF5hXp7rryg0t5o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.7 h1:v/p+hkXFW6yl1rEsTyCafFP+/7TiouM2XtXKBn80vwU= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.7/go.mod h1:mMUqvS3BZfvN1OfK4OFTYf1+T0X6nwmSXJM2keaPsSM= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2/go.mod h1:DsT43c1oTBmp3iQkMcoZOoKThwZvt8X3Pz6UmznJ4GY= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.14 h1:elSS3K5m39sCOvtd43SlAw60gxqAcGmkEDeMp9O+CTQ= @@ -1707,7 +1712,6 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2226,7 +2230,6 @@ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYm pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 11dea3b3580..8e23ce24127 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -54,7 +54,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect github.com/aws/smithy-go v1.22.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/coder/websocket v1.8.12 // indirect @@ -135,7 +135,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect - github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic v1.12.3 // indirect github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect @@ -204,7 +204,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gagliardetto/binary v0.7.7 // indirect github.com/gagliardetto/solana-go v1.8.4 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -234,11 +234,11 @@ require ( github.com/go-openapi/validate v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.0 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-webauthn/webauthn v0.9.4 // indirect github.com/go-webauthn/x v0.1.5 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-yaml v1.12.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -333,7 +333,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect @@ -348,7 +348,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -403,7 +403,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/prometheus v0.54.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.10.1 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 13fd67ed34a..f617bbd7238 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -280,8 +280,10 @@ github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8 github.com/bytecodealliance/wasmtime-go/v23 v23.0.0/go.mod h1:5YIL+Ouiww2zpO7u+iZ1U1G5NvmwQYaXdmCZQGjQM0U= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= @@ -519,6 +521,7 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= @@ -605,6 +608,7 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= @@ -628,6 +632,7 @@ github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -1023,6 +1028,7 @@ github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ib github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -1097,6 +1103,7 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1319,6 +1326,7 @@ github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= diff --git a/integration-tests/smoke/config/dual_transmission_e2e.toml b/integration-tests/smoke/config/dual_transmission_e2e.toml new file mode 100644 index 00000000000..c2f08f6bacc --- /dev/null +++ b/integration-tests/smoke/config/dual_transmission_e2e.toml @@ -0,0 +1,55 @@ +[contracts] + +[blockchain_a] +type = "anvil" +docker_cmd_params = ["-b", "1"] + +[nodeset] +nodes = 5 +override_mode = "all" + +[nodeset.db] +image = "postgres:12.0" + +[[nodeset.node_specs]] + +[nodeset.node_specs.node] +#docker_ctx = "../../.." +#docker_file = "plugins/chainlink.Dockerfile - path to docker image you need" +# this is replaced in CI for most commit ref you provide +#image = "public.ecr.aws/chainlink/chainlink:v2.17.0" +image = "localhost:5000/chainlink:develop" +user_config_overrides = """ + [Feature] + LogPoller = true + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + + [[EVM]] + ChainID = '1337' + ChainType = 'dualBroadcast' + AutoCreateKey = true + FinalityDepth = 1 + MinContractPayment = 0 + + [EVM.TxmV2] + Enabled = true + BlockTime = '11s' + CustomURL = '%s' + + [EVM.Transactions] + ForwardersEnabled = true + + [EVM.Transactions.AutoPurge] + Enabled = true + Threshold = 5 + MinAttempts = 10000 + DetectionApiUrl = 'https://protect-holesky.flashbots.net/tx/' + + [EVM.GasEstimator] + BumpThreshold = 6 +""" diff --git a/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go b/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go new file mode 100644 index 00000000000..b2b19c171f7 --- /dev/null +++ b/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go @@ -0,0 +1,230 @@ +package smoke + +import ( + "fmt" + "math/big" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + "github.com/smartcontractkit/chainlink-testing-framework/lib/logging" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/integration-tests/actions" + "github.com/smartcontractkit/chainlink/integration-tests/contracts" + gethwrappers "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/dual-transmission" +) + +type Cfg struct { + BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` + Contracts *actions.Input `toml:"contracts" validate:"required"` + NodeSet *ns.Input `toml:"nodeset" validate:"required"` +} + +var bootstrapJobSpec = ` +type = "bootstrap" +schemaVersion = 1 +name = "smoke OEV bootstrap" +externalJobID = "%s" +contractID = "%s" +relay = "%s" + +[relayConfig] +chainID = %s +` +var oevJobSpec = ` +type = "offchainreporting2" +schemaVersion = 1 +name = "OEV job" +externalJobID = "%s" +forwardingAllowed = true +maxTaskDuration = "0s" +contractID = "%s" +relay = "%s" +pluginType = "median" +transmitterID = "%s" +observationSource = """ + //randomness + val1 [type="memo" value="10"] + val2 [type="memo" value="20"] + val3 [type="memo" value="30"] + val4 [type="memo" value="40"] + val5 [type="memo" value="50"] + val6 [type="memo" value="60"] + val7 [type="memo" value="70"] + val8 [type="memo" value="80"] + val9 [type="memo" value="90"] + + random1 [type="any"] + random2 [type="any"] + random3 [type="any"] + + val1 -> random1 + val2 -> random2 + val3 -> random3 + val4 -> random1 + val5 -> random2 + val6 -> random3 + val7 -> random1 + val8 -> random2 + val9 -> random3 + + + // data source 1 + ds1_multiply [type="multiply" times=100] + + // data source 2 + ds2_multiply [type="multiply" times=100] + + + // data source 3 + ds3_multiply [type="multiply" times=100] + + + random1 -> ds1_multiply -> answer + random2 -> ds2_multiply -> answer + random3 -> ds3_multiply -> answer + + answer [type=median] +""" + +[relayConfig] +chainID = %s +enableDualTransmission = true + +[relayConfig.dualTransmission] +contractAddress = "%s" +transmitterAddress = "%s" + +[relayConfig.dualTransmission.meta] +hint = [ "calldata" ] +refund = [ "0xbc1Be4cC8790b0C99cff76100E0e6d01E32C6A2C:90" ] + +[pluginConfig] +juelsPerFeeCoinSource = """ +juels_per_fee_coin [type="sum" values=<[0]>]; +""" +` + +func TestSmoke(t *testing.T) { + lggr := logging.GetTestLogger(t) + pkey := os.Getenv("PRIVATE_KEY") + require.NotEmpty(t, pkey, "private key is empty") + in, err := framework.Load[Cfg](t) + require.NoError(t, err) + + //1. Set up nodes & docker environment (5 nodes) + bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) + require.NoError(t, err) + + //Replace customURL + in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides = fmt.Sprintf(in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides, bc.Nodes[0].DockerInternalHTTPUrl) + + out, err := ns.NewSharedDBNodeSet(in.NodeSet, bc) + require.NoError(t, err) + + // connecting clients + sethClient, err := seth.NewClientBuilder(). + WithGasPriceEstimations(true, 0, seth.Priority_Fast). + WithRpcUrl(bc.Nodes[0].HostWSUrl). + WithPrivateKeys([]string{pkey}). + Build() + require.NoError(t, err) + nodeClients, err := clclient.New(out.CLNodes) + require.NoError(t, err) + bootstrapNode, workerNodes := nodeClients[0], nodeClients[1:] + + //2. Create secondary addresses + primaryAddresses := make([]common.Address, 0) + secondaryAddresses := make([]common.Address, 0) + //Create secondary ETH key + for i := range workerNodes { + primary, err := workerNodes[i].PrimaryEthAddress() + require.NoError(t, err, "Cannot get primary key") + primaryAddresses = append(primaryAddresses, common.HexToAddress(primary)) + + key, _, err := workerNodes[i].CreateTxKey("evm", in.BlockchainA.ChainID) //TODO: @george-dorin Remove hardcoded evm + require.NoError(t, err, "Cannot create secondary key") + secondaryAddresses = append(secondaryAddresses, common.HexToAddress(key.Data.Attributes.Address)) + } + + //3. Restart + out, err = ns.UpgradeNodeSet(in.NodeSet, bc, time.Second*10) + require.NoError(t, err, "Cannot restart nodes") + nodeClients, err = clclient.New(out.CLNodes) + require.NoError(t, err, "Cannot create clients") + bootstrapNode, workerNodes = nodeClients[0], nodeClients[1:] + + //4. Fund addresses + err = ns.FundNodes(sethClient.Client, nodeClients, pkey, 0.2) + require.NoError(t, err) + for i := range secondaryAddresses { + err = ns.SendETH(sethClient.Client, pkey, secondaryAddresses[i].String(), big.NewFloat(0.2)) + require.NoError(t, err, "Cannot fund secondary address") + } + + //5. Deploy link contract + linkContract, err := contracts.DeployLinkTokenContract(lggr, sethClient) + require.NoError(t, err, "Error loading/deploying link token contract") + + //6. Deploy forwarders + var operators []common.Address + operators, forwarders, _ := actions.DeployForwarderContracts( + t, sethClient, common.HexToAddress(linkContract.Address()), len(workerNodes), + ) + require.Equal(t, len(workerNodes), len(operators), "Number of operators should match number of nodes") + require.Equal(t, len(workerNodes), len(forwarders), "Number of authorized forwarders should match number of nodes") + + //7. Configure forwarders + require.NoError(t, err, "Retrieving on-chain wallet addresses for chainlink nodes shouldn't fail") + for i := range workerNodes { + actions.AcceptAuthorizedReceiversOperator( + t, lggr, sethClient, operators[i], forwarders[i], []common.Address{primaryAddresses[i], secondaryAddresses[i]}) + require.NoError(t, err, "Accepting Authorize Receivers on Operator shouldn't fail") + + chainIDBigInt := new(big.Int) + chainIDBigInt, ok := chainIDBigInt.SetString(in.BlockchainA.ChainID, 10) + require.True(t, ok, "ChainID cannot be converted to big.Int") + _, _, err = workerNodes[i].TrackForwarder(chainIDBigInt, forwarders[i]) + require.NoError(t, err, "Cannot track forwarders") + } + + //8. Deploy dual agg + //in.Contracts.URL = bc.Nodes[0].HostWSUrl + ocrOffchainOptions := contracts.DefaultOffChainAggregatorOptions() + oevContract, err := actions.NewDualAggregatorDeployment(sethClient, in.Contracts, linkContract.Address(), ocrOffchainOptions) + require.NoError(t, err) + _, err = gethwrappers.NewDualAggregator(oevContract.Addresses[0], sethClient.Client) + require.NoError(t, err) + + //9. Create jobs + //Bootstrap + response, _, err2 := bootstrapNode.CreateJobRaw(fmt.Sprintf(bootstrapJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), "evm", in.BlockchainA.ChainID)) + require.NoError(t, err2) + require.Empty(t, response.Errors) + + //Feed job + for i := range workerNodes { + response, _, err2 = bootstrapNode.CreateJobRaw(fmt.Sprintf(oevJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), "evm", primaryAddresses[i], in.BlockchainA.ChainID, oevContract.Addresses[0].String(), secondaryAddresses[i])) + require.NoError(t, err2) + require.Empty(t, response.Errors) + } + + //10. Configure dual agg + //ocrOffchainOptions := contracts2.DefaultOffChainAggregatorOptions() + //actions.BuildMedianOCR2ConfigLocal(workerNodes, ocrOffchainOptions) + //dualAggContract.SetConfig() + + t.Run("test OEV", func(t *testing.T) { + //dualAggContract.DualAggregatorFilterer.FilterSecondaryRoundIdUpdated() + + //Check round ID and check if we have transmitSecondary event + }) +} diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go index 545818e3348..e1914c967a8 100644 --- a/integration-tests/testconfig/testconfig.go +++ b/integration-tests/testconfig/testconfig.go @@ -260,21 +260,22 @@ func (c *Common) Validate() error { type Product string const ( - Automation Product = "automation" - Cron Product = "cron" - Flux Product = "flux" - ForwarderOcr Product = "forwarder_ocr" - ForwarderOcr2 Product = "forwarder_ocr2" - Functions Product = "functions" - Keeper Product = "keeper" - LogPoller Product = "log_poller" - Node Product = "node" - OCR Product = "ocr" - OCR2 Product = "ocr2" - RunLog Product = "runlog" - VRF Product = "vrf" - VRFv2 Product = "vrfv2" - VRFv2Plus Product = "vrfv2plus" + Automation Product = "automation" + Cron Product = "cron" + Flux Product = "flux" + ForwarderOcr Product = "forwarder_ocr" + ForwarderOcr2 Product = "forwarder_ocr2" + ForwarderOcr2DualTransmission Product = "forwarder_ocr2_dual_transmission" + Functions Product = "functions" + Keeper Product = "keeper" + LogPoller Product = "log_poller" + Node Product = "node" + OCR Product = "ocr" + OCR2 Product = "ocr2" + RunLog Product = "runlog" + VRF Product = "vrf" + VRFv2 Product = "vrfv2" + VRFv2Plus Product = "vrfv2plus" CCIP Product = "ccip" ) From d91dc36d20d72d07f652b085581b6cc9f3b4e8da Mon Sep 17 00:00:00 2001 From: george-dorin Date: Fri, 20 Dec 2024 12:28:02 +0200 Subject: [PATCH 2/3] wip --- .../actions/deployment_dual_aggregator.go | 6 +- .../smoke/config/dual_transmission_e2e.toml | 9 + .../config/dual_transmission_e2e_holesky.toml | 68 ++++ .../ocr2_forwarders_dual_transmission_test.go | 307 ++++++++++++++++-- 4 files changed, 358 insertions(+), 32 deletions(-) create mode 100644 integration-tests/smoke/config/dual_transmission_e2e_holesky.toml diff --git a/integration-tests/actions/deployment_dual_aggregator.go b/integration-tests/actions/deployment_dual_aggregator.go index d232ef45c3c..ead825f8daf 100644 --- a/integration-tests/actions/deployment_dual_aggregator.go +++ b/integration-tests/actions/deployment_dual_aggregator.go @@ -37,9 +37,9 @@ func NewDualAggregatorDeployment(c *seth.Client, in *Input, linkContractAddress offchainOptions.RequesterAccessController, // requesterAccessController offchainOptions.Decimals, offchainOptions.Description, - "0x0000000000000000000000000000000000000000", // secondary proxy - 30, // cutOffTime - 20, // maxSyncIterations + common.HexToAddress("0x0000000000000000000000000000000000000000"), // secondary proxy + uint32(30), // cutOffTime + uint32(20), // maxSyncIterations ) if err != nil { return nil, err diff --git a/integration-tests/smoke/config/dual_transmission_e2e.toml b/integration-tests/smoke/config/dual_transmission_e2e.toml index c2f08f6bacc..1a1788923a9 100644 --- a/integration-tests/smoke/config/dual_transmission_e2e.toml +++ b/integration-tests/smoke/config/dual_transmission_e2e.toml @@ -1,8 +1,17 @@ +[test_config] +overwrite_custom_url = false +test_timeout_minutes = 10 +expected_event_count = 5 + [contracts] [blockchain_a] type = "anvil" docker_cmd_params = ["-b", "1"] +chain_id = "1337" + +[blockchain_a.out] +family = "evm" [nodeset] nodes = 5 diff --git a/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml b/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml new file mode 100644 index 00000000000..f3e14171959 --- /dev/null +++ b/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml @@ -0,0 +1,68 @@ +[test_config] +overwrite_custom_url = false +test_timeout_minutes = 10 +expected_event_count = 5 +custom_url = "https://rpc-holesky.flashbots.net/fast" + +[contracts] + +[blockchain_a] +type = "geth" +docker_cmd_params = ["-b", "1"] + +[blockchain_a.out] +chain_id = "17000" +use_cache = false +family = "evm" + +[[blockchain_a.out.nodes]] +docker_internal_http_url = "https://nd-033-002-348.p2pify.com/f46b081bafa80b7c0be87edfdd6c0815" +docker_internal_ws_url = "wss://ws-nd-033-002-348.p2pify.com/f46b081bafa80b7c0be87edfdd6c0815" +http_url = "https://nd-033-002-348.p2pify.com/f46b081bafa80b7c0be87edfdd6c0815" +ws_url = "wss://ws-nd-033-002-348.p2pify.com/f46b081bafa80b7c0be87edfdd6c0815" + +[nodeset] +nodes = 5 +override_mode = "all" + +[nodeset.db] +image = "postgres:12.0" + +[[nodeset.node_specs]] + +[nodeset.node_specs.node] +image = "localhost:5000/chainlink:develop" +user_config_overrides = """ + [Feature] + LogPoller = true + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + + [[EVM]] + ChainID = '17000' + ChainType = 'dualBroadcast' + AutoCreateKey = true + FinalityDepth = 1 + MinContractPayment = 0 + + [EVM.TxmV2] + Enabled = true + BlockTime = '11s' + CustomURL = '%s' + + [EVM.Transactions] + ForwardersEnabled = true + + [EVM.Transactions.AutoPurge] + Enabled = true + Threshold = 5 + MinAttempts = 10000 + DetectionApiUrl = 'https://protect-holesky.flashbots.net/tx/' + + [EVM.GasEstimator] + BumpThreshold = 6 +""" diff --git a/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go b/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go index b2b19c171f7..4f7fba23d4c 100644 --- a/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go +++ b/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go @@ -1,31 +1,54 @@ package smoke import ( + "context" + "crypto/ed25519" + "encoding/hex" + "errors" "fmt" "math/big" "os" + "strings" "testing" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/google/uuid" + "github.com/rs/zerolog" + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" + "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "github.com/smartcontractkit/chainlink-testing-framework/framework" "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" "github.com/smartcontractkit/chainlink-testing-framework/lib/logging" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" "github.com/smartcontractkit/chainlink/integration-tests/actions" "github.com/smartcontractkit/chainlink/integration-tests/contracts" gethwrappers "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/dual-transmission" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/testhelpers" ) +type SvrTestConfig struct { + OverwriteCustomURL bool `toml:"overwrite_custom_url"` + CustomURL string `toml:"custom_url"` + TestTimeoutMinutes int16 `toml:"test_timeout_minutes" validate:"required"` + ExpectedEventsCount int16 `toml:"expected_event_count" validate:"required"` +} + type Cfg struct { BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` Contracts *actions.Input `toml:"contracts" validate:"required"` NodeSet *ns.Input `toml:"nodeset" validate:"required"` + SvrTestCfg *SvrTestConfig `toml:"test_config" validate:"required"` } var bootstrapJobSpec = ` @@ -48,8 +71,11 @@ forwardingAllowed = true maxTaskDuration = "0s" contractID = "%s" relay = "%s" +ocrKeyBundleID = "%s" pluginType = "median" transmitterID = "%s" +p2pv2Bootstrappers = ["%s@%s"] + observationSource = """ //randomness val1 [type="memo" value="10"] @@ -120,12 +146,25 @@ func TestSmoke(t *testing.T) { in, err := framework.Load[Cfg](t) require.NoError(t, err) - //1. Set up nodes & docker environment (5 nodes) + testTimeout, err := time.ParseDuration(fmt.Sprintf("%dm", in.SvrTestCfg.TestTimeoutMinutes)) //TODO: @george-dorin Fix Me! + require.NoError(t, err) + + chainID := in.BlockchainA.ChainID + require.NotEmpty(t, chainID, "blockchain_a.chain_id cannot be empty") + chainFamily := in.BlockchainA.Out.Family + require.NotEmpty(t, chainFamily, "need to specify a blockchain_a.out.family") + + // 1. Set up nodes & docker environment (5 nodes) bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) require.NoError(t, err) - //Replace customURL - in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides = fmt.Sprintf(in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides, bc.Nodes[0].DockerInternalHTTPUrl) + // Replace customURL + if in.SvrTestCfg.OverwriteCustomURL { + require.NotEmpty(t, in.SvrTestCfg.CustomURL, "when overwrite_custom_url=true you need to provide a non empty custom_url") + in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides = fmt.Sprintf(in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides, in.SvrTestCfg.CustomURL) + } else { + in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides = fmt.Sprintf(in.NodeSet.NodeSpecs[0].Node.UserConfigOverrides, bc.Nodes[0].DockerInternalHTTPUrl) + } out, err := ns.NewSharedDBNodeSet(in.NodeSet, bc) require.NoError(t, err) @@ -149,8 +188,7 @@ func TestSmoke(t *testing.T) { primary, err := workerNodes[i].PrimaryEthAddress() require.NoError(t, err, "Cannot get primary key") primaryAddresses = append(primaryAddresses, common.HexToAddress(primary)) - - key, _, err := workerNodes[i].CreateTxKey("evm", in.BlockchainA.ChainID) //TODO: @george-dorin Remove hardcoded evm + key, _, err := workerNodes[i].CreateTxKey(chainFamily, chainID) require.NoError(t, err, "Cannot create secondary key") secondaryAddresses = append(secondaryAddresses, common.HexToAddress(key.Data.Attributes.Address)) } @@ -158,23 +196,25 @@ func TestSmoke(t *testing.T) { //3. Restart out, err = ns.UpgradeNodeSet(in.NodeSet, bc, time.Second*10) require.NoError(t, err, "Cannot restart nodes") + + // Reconnect to clients nodeClients, err = clclient.New(out.CLNodes) require.NoError(t, err, "Cannot create clients") bootstrapNode, workerNodes = nodeClients[0], nodeClients[1:] - //4. Fund addresses - err = ns.FundNodes(sethClient.Client, nodeClients, pkey, 0.2) + // 4. Fund addresses + err = ns.FundNodes(sethClient.Client, nodeClients, pkey, 0.1) require.NoError(t, err) for i := range secondaryAddresses { - err = ns.SendETH(sethClient.Client, pkey, secondaryAddresses[i].String(), big.NewFloat(0.2)) + err = ns.SendETH(sethClient.Client, pkey, secondaryAddresses[i].String(), big.NewFloat(0.1)) require.NoError(t, err, "Cannot fund secondary address") } - //5. Deploy link contract + // 5. Deploy link contract linkContract, err := contracts.DeployLinkTokenContract(lggr, sethClient) require.NoError(t, err, "Error loading/deploying link token contract") - //6. Deploy forwarders + // 6. Deploy forwarders var operators []common.Address operators, forwarders, _ := actions.DeployForwarderContracts( t, sethClient, common.HexToAddress(linkContract.Address()), len(workerNodes), @@ -182,49 +222,258 @@ func TestSmoke(t *testing.T) { require.Equal(t, len(workerNodes), len(operators), "Number of operators should match number of nodes") require.Equal(t, len(workerNodes), len(forwarders), "Number of authorized forwarders should match number of nodes") - //7. Configure forwarders + // 7. Configure forwarders require.NoError(t, err, "Retrieving on-chain wallet addresses for chainlink nodes shouldn't fail") for i := range workerNodes { actions.AcceptAuthorizedReceiversOperator( t, lggr, sethClient, operators[i], forwarders[i], []common.Address{primaryAddresses[i], secondaryAddresses[i]}) require.NoError(t, err, "Accepting Authorize Receivers on Operator shouldn't fail") - chainIDBigInt := new(big.Int) - chainIDBigInt, ok := chainIDBigInt.SetString(in.BlockchainA.ChainID, 10) + chainIDBigInt, ok := new(big.Int).SetString(chainID, 10) require.True(t, ok, "ChainID cannot be converted to big.Int") _, _, err = workerNodes[i].TrackForwarder(chainIDBigInt, forwarders[i]) require.NoError(t, err, "Cannot track forwarders") } - //8. Deploy dual agg + // 8. Deploy dual agg //in.Contracts.URL = bc.Nodes[0].HostWSUrl ocrOffchainOptions := contracts.DefaultOffChainAggregatorOptions() oevContract, err := actions.NewDualAggregatorDeployment(sethClient, in.Contracts, linkContract.Address(), ocrOffchainOptions) require.NoError(t, err) - _, err = gethwrappers.NewDualAggregator(oevContract.Addresses[0], sethClient.Client) + dualAggContract, err := gethwrappers.NewDualAggregator(oevContract.Addresses[0], sethClient.Client) require.NoError(t, err) - //9. Create jobs - //Bootstrap - response, _, err2 := bootstrapNode.CreateJobRaw(fmt.Sprintf(bootstrapJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), "evm", in.BlockchainA.ChainID)) + // 9. Configure dual agg + config, err := BuildDualAggregatorOCR2ConfigLocal(workerNodes, ocrOffchainOptions) + require.NoError(t, err, "error creating OEV on-chain config") + _, err = dualAggContract.SetConfig(sethClient.NewTXOpts(), config.Signers, config.Transmitters, config.F, config.OnchainConfig, config.OffchainConfigVersion, config.OffchainConfig) + require.NoError(t, err, "error configuring OEV contract") + + // 10. Create jobs + // Bootstrap + response, _, err2 := bootstrapNode.CreateJobRaw(fmt.Sprintf(bootstrapJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), chainFamily, chainID)) require.NoError(t, err2) require.Empty(t, response.Errors) - //Feed job + // Feed job + bootstrapPeerID, err := bootstrapNode.MustReadP2PKeys() + require.NoError(t, err, "cannot get bootstrap peerID") + require.Equal(t, 1, len(bootstrapPeerID.Data), "expected one bootstrap P2P key") + for i := range workerNodes { - response, _, err2 = bootstrapNode.CreateJobRaw(fmt.Sprintf(oevJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), "evm", primaryAddresses[i], in.BlockchainA.ChainID, oevContract.Addresses[0].String(), secondaryAddresses[i])) - require.NoError(t, err2) + ocr2Keys, err := workerNodes[i].MustReadOCR2Keys() + require.NoError(t, err, "cannot fetch OCR2 keys") + require.Equal(t, 1, len(ocr2Keys.Data), "expecting only one OCR2 key") + response, _, err = workerNodes[i].CreateJobRaw(fmt.Sprintf(oevJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), chainFamily, ocr2Keys.Data[0].ID, primaryAddresses[i], bootstrapPeerID.Data[0].Attributes.PeerID, + strings.TrimPrefix(out.CLNodes[0].Node.DockerP2PUrl, "http://"), chainID, oevContract.Addresses[0].String(), secondaryAddresses[i])) + require.NoError(t, err) require.Empty(t, response.Errors) } - //10. Configure dual agg - //ocrOffchainOptions := contracts2.DefaultOffChainAggregatorOptions() - //actions.BuildMedianOCR2ConfigLocal(workerNodes, ocrOffchainOptions) - //dualAggContract.SetConfig() + t.Run("test SVR transmissions and events", func(t *testing.T) { + require.NoError(t, waitForDualAggregatorEvents(testcontext.Get(t), dualAggContract, in.SvrTestCfg.ExpectedEventsCount, testTimeout, lggr)) + }) +} - t.Run("test OEV", func(t *testing.T) { - //dualAggContract.DualAggregatorFilterer.FilterSecondaryRoundIdUpdated() +func BuildDualAggregatorOCR2ConfigLocal(workerNodes []*clclient.ChainlinkClient, ocrOffchainOptions contracts.OffchainOptions) (*contracts.OCRv2Config, error) { + S, oracleIdentities, err := getOracleIdentitiesWithKeyIndexLocal(workerNodes, 0) + if err != nil { + return nil, err + } + signerKeys, _, f_, _, offchainConfigVersion, offchainConfig, err := confighelper.ContractSetConfigArgsForTests( + 30*time.Second, // deltaProgress time.Duration, + 30*time.Second, // deltaResend time.Duration, + 10*time.Second, // deltaRound time.Duration, + 20*time.Second, // deltaGrace time.Duration, + 20*time.Second, // deltaStage time.Duration, + 3, // rMax uint8, + S, // s []int, + oracleIdentities, // oracles []OracleIdentityExtra, + median.OffchainConfig{ + AlphaReportInfinite: false, + AlphaReportPPB: 1, + AlphaAcceptInfinite: false, + AlphaAcceptPPB: 1, + DeltaC: time.Minute * 30, + }.Encode(), // reportingPluginConfig []byte, + nil, + 5*time.Second, // maxDurationQuery time.Duration, + 5*time.Second, // maxDurationObservation time.Duration, + 5*time.Second, // maxDurationReport time.Duration, + 5*time.Second, // maxDurationShouldAcceptFinalizedReport time.Duration, + 5*time.Second, // maxDurationShouldTransmitAcceptedReport time.Duration, + 1, // f int, + nil, // The median reporting plugin has an empty onchain config + ) + if err != nil { + return nil, err + } - //Check round ID and check if we have transmitSecondary event - }) + // Convert signers to addresses + var signerAddresses []common.Address + for _, signer := range signerKeys { + signerAddresses = append(signerAddresses, common.BytesToAddress(signer)) + } + + // Replace transmitter with forwaders + var transmitterAddresses []common.Address + for i := range workerNodes { + t, _, err := workerNodes[i].GetForwarders() + if err != nil { + return nil, errors.New("cannot get forwarder from node") + } + if len(t.Data) < 1 { + return nil, errors.New("no forwarders found on node") + } + transmitterAddresses = append(transmitterAddresses, common.HexToAddress(t.Data[0].Attributes.Address)) + } + + onchainConfig, err := testhelpers.GenerateDefaultOCR2OnchainConfig(ocrOffchainOptions.MinimumAnswer, ocrOffchainOptions.MaximumAnswer) + + return &contracts.OCRv2Config{ + Signers: signerAddresses, + Transmitters: transmitterAddresses, + F: f_, + OnchainConfig: onchainConfig, + OffchainConfigVersion: offchainConfigVersion, + OffchainConfig: []byte(fmt.Sprintf("0x%s", offchainConfig)), + }, err +} + +func getOracleIdentitiesWithKeyIndexLocal( + chainlinkNodes []*clclient.ChainlinkClient, + keyIndex int, +) ([]int, []confighelper.OracleIdentityExtra, error) { + S := make([]int, len(chainlinkNodes)) + oracleIdentities := make([]confighelper.OracleIdentityExtra, len(chainlinkNodes)) + sharedSecretEncryptionPublicKeys := make([]types.ConfigEncryptionPublicKey, len(chainlinkNodes)) + eg := &errgroup.Group{} + for i, cl := range chainlinkNodes { + index, chainlinkNode := i, cl + eg.Go(func() error { + addresses, err := chainlinkNode.EthAddresses() + if err != nil { + return err + } + ocr2Keys, err := chainlinkNode.MustReadOCR2Keys() + if err != nil { + return err + } + var ocr2Config nodeclient.OCR2KeyAttributes + for _, key := range ocr2Keys.Data { + if key.Attributes.ChainType == string(chaintype.EVM) { + ocr2Config = nodeclient.OCR2KeyAttributes(key.Attributes) + break + } + } + + keys, err := chainlinkNode.MustReadP2PKeys() + if err != nil { + return err + } + p2pKeyID := keys.Data[0].Attributes.PeerID + + offchainPkBytes, err := hex.DecodeString(strings.TrimPrefix(ocr2Config.OffChainPublicKey, "ocr2off_evm_")) + if err != nil { + return err + } + + offchainPkBytesFixed := [ed25519.PublicKeySize]byte{} + n := copy(offchainPkBytesFixed[:], offchainPkBytes) + if n != ed25519.PublicKeySize { + return fmt.Errorf("wrong number of elements copied") + } + + configPkBytes, err := hex.DecodeString(strings.TrimPrefix(ocr2Config.ConfigPublicKey, "ocr2cfg_evm_")) + if err != nil { + return err + } + + configPkBytesFixed := [ed25519.PublicKeySize]byte{} + n = copy(configPkBytesFixed[:], configPkBytes) + if n != ed25519.PublicKeySize { + return fmt.Errorf("wrong number of elements copied") + } + + onchainPkBytes, err := hex.DecodeString(strings.TrimPrefix(ocr2Config.OnChainPublicKey, "ocr2on_evm_")) + if err != nil { + return err + } + + sharedSecretEncryptionPublicKeys[index] = configPkBytesFixed + oracleIdentities[index] = confighelper.OracleIdentityExtra{ + OracleIdentity: confighelper.OracleIdentity{ + OnchainPublicKey: onchainPkBytes, + OffchainPublicKey: offchainPkBytesFixed, + PeerID: p2pKeyID, + TransmitAccount: types.Account(addresses[keyIndex]), + }, + ConfigEncryptionPublicKey: configPkBytesFixed, + } + S[index] = 1 + return nil + }) + } + + return S, oracleIdentities, eg.Wait() +} + +func waitForDualAggregatorEvents( + ctx context.Context, + dualAggContract *gethwrappers.DualAggregator, + nrOfEvents int16, + timeout time.Duration, + lggr zerolog.Logger, +) error { + possibleRounds := make([]uint32, 0) + for i := range 1000 { + possibleRounds = append(possibleRounds, uint32(i)) + } + + startBlock := uint64(2969733) + lggr.Info().Msg("Waiting for Dual aggregator events") + var confirmedPrimary, confirmedSecondary int16 + + //Subscribe to events + /* + Primary first - NewTransmission + Primary second - PrimaryFeedUnlocked + Secondary first - SecondaryRoundIdUpdated NewTransmission + Secondary second - SecondaryRoundIdUpdated + */ + + ntSink := make(chan *gethwrappers.DualAggregatorNewTransmission, 100) + newTransmissionsEvents, err := dualAggContract.WatchNewTransmission(&bind.WatchOpts{Context: ctx, Start: &startBlock}, ntSink, possibleRounds) + if err != nil { + return err + } + defer newTransmissionsEvents.Unsubscribe() + + sruSink := make(chan *gethwrappers.DualAggregatorSecondaryRoundIdUpdated, 100) + sruEvents, err := dualAggContract.WatchSecondaryRoundIdUpdated(&bind.WatchOpts{Context: ctx, Start: &startBlock}, sruSink, possibleRounds) + if err != nil { + return err + } + defer sruEvents.Unsubscribe() + + for { + select { + case ret := <-ntSink: + lggr.Info().Msg(fmt.Sprintf("Received NewTransmission event from %s for roundID %d", ret.Transmitter.String(), ret.AggregatorRoundId)) + confirmedPrimary++ + if confirmedPrimary > nrOfEvents && confirmedSecondary > nrOfEvents { + return nil + } + case ret := <-sruSink: + lggr.Info().Msg(fmt.Sprintf("Received SecondaryRoundIdUpdated for roundID %d", ret.SecondaryRoundId)) + confirmedSecondary++ + if confirmedPrimary > nrOfEvents && confirmedSecondary > nrOfEvents { + return nil + } + case <-time.After(timeout): + return fmt.Errorf("timeout waiting for dual aggregator transmission events") + } + } + + return nil } From 200088fa969a4d3f00b29abdd87d010d8865b18b Mon Sep 17 00:00:00 2001 From: george-dorin Date: Fri, 20 Dec 2024 13:00:43 +0200 Subject: [PATCH 3/3] Fix naming --- .../smoke/config/dual_transmission_e2e_holesky.toml | 8 ++++---- ...ransmission_test.go => ocr2_dual_transmission_test.go} | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) rename integration-tests/smoke/{ocr2_forwarders_dual_transmission_test.go => ocr2_dual_transmission_test.go} (98%) diff --git a/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml b/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml index f3e14171959..5207508e93c 100644 --- a/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml +++ b/integration-tests/smoke/config/dual_transmission_e2e_holesky.toml @@ -1,17 +1,17 @@ [test_config] overwrite_custom_url = false -test_timeout_minutes = 10 -expected_event_count = 5 +test_timeout_minutes = 60 +expected_event_count = 10 custom_url = "https://rpc-holesky.flashbots.net/fast" [contracts] [blockchain_a] -type = "geth" +type = "anvil" docker_cmd_params = ["-b", "1"] +chain_id = "17000" [blockchain_a.out] -chain_id = "17000" use_cache = false family = "evm" diff --git a/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go b/integration-tests/smoke/ocr2_dual_transmission_test.go similarity index 98% rename from integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go rename to integration-tests/smoke/ocr2_dual_transmission_test.go index 4f7fba23d4c..c92291873d1 100644 --- a/integration-tests/smoke/ocr2_forwarders_dual_transmission_test.go +++ b/integration-tests/smoke/ocr2_dual_transmission_test.go @@ -264,7 +264,7 @@ func TestSmoke(t *testing.T) { ocr2Keys, err := workerNodes[i].MustReadOCR2Keys() require.NoError(t, err, "cannot fetch OCR2 keys") require.Equal(t, 1, len(ocr2Keys.Data), "expecting only one OCR2 key") - response, _, err = workerNodes[i].CreateJobRaw(fmt.Sprintf(oevJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), chainFamily, ocr2Keys.Data[0].ID, primaryAddresses[i], bootstrapPeerID.Data[0].Attributes.PeerID, + response, _, err := workerNodes[i].CreateJobRaw(fmt.Sprintf(oevJobSpec, uuid.New().String(), oevContract.Addresses[0].String(), chainFamily, ocr2Keys.Data[0].ID, primaryAddresses[i], bootstrapPeerID.Data[0].Attributes.PeerID, strings.TrimPrefix(out.CLNodes[0].Node.DockerP2PUrl, "http://"), chainID, oevContract.Addresses[0].String(), secondaryAddresses[i])) require.NoError(t, err) require.Empty(t, response.Errors) @@ -430,7 +430,7 @@ func waitForDualAggregatorEvents( possibleRounds = append(possibleRounds, uint32(i)) } - startBlock := uint64(2969733) + startBlock := uint64(1) //TODO: @george-dorin Fix Me! lggr.Info().Msg("Waiting for Dual aggregator events") var confirmedPrimary, confirmedSecondary int16